//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension AutoScaling {
    // MARK: Enums

    public enum AcceleratorManufacturer: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case amazonWebServices = "amazon-web-services"
        case amd = "amd"
        case nvidia = "nvidia"
        case xilinx = "xilinx"
        public var description: String { return self.rawValue }
    }

    public enum AcceleratorName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case a100 = "a100"
        case k80 = "k80"
        case m60 = "m60"
        case radeonProV520 = "radeon-pro-v520"
        case t4 = "t4"
        case v100 = "v100"
        case vu9p = "vu9p"
        public var description: String { return self.rawValue }
    }

    public enum AcceleratorType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case fpga = "fpga"
        case gpu = "gpu"
        case inference = "inference"
        public var description: String { return self.rawValue }
    }

    public enum BareMetal: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case excluded = "excluded"
        case included = "included"
        case required = "required"
        public var description: String { return self.rawValue }
    }

    public enum BurstablePerformance: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case excluded = "excluded"
        case included = "included"
        case required = "required"
        public var description: String { return self.rawValue }
    }

    public enum CapacityDistributionStrategy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case balancedBestEffort = "balanced-best-effort"
        case balancedOnly = "balanced-only"
        public var description: String { return self.rawValue }
    }

    public enum CapacityReservationPreference: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `default` = "default"
        case capacityReservationsFirst = "capacity-reservations-first"
        case capacityReservationsOnly = "capacity-reservations-only"
        case none = "none"
        public var description: String { return self.rawValue }
    }

    public enum CpuManufacturer: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case amazonWebServices = "amazon-web-services"
        case amd = "amd"
        case apple = "apple"
        case intel = "intel"
        public var description: String { return self.rawValue }
    }

    public enum ImpairedZoneHealthCheckBehavior: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ignoreUnhealthy = "IgnoreUnhealthy"
        case replaceUnhealthy = "ReplaceUnhealthy"
        public var description: String { return self.rawValue }
    }

    public enum InstanceGeneration: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case current = "current"
        case previous = "previous"
        public var description: String { return self.rawValue }
    }

    public enum InstanceMetadataEndpointState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case disabled = "disabled"
        case enabled = "enabled"
        public var description: String { return self.rawValue }
    }

    public enum InstanceMetadataHttpTokensState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case optional = "optional"
        case required = "required"
        public var description: String { return self.rawValue }
    }

    public enum InstanceRefreshStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case baking = "Baking"
        case cancelled = "Cancelled"
        case cancelling = "Cancelling"
        case failed = "Failed"
        case inProgress = "InProgress"
        case pending = "Pending"
        case rollbackFailed = "RollbackFailed"
        case rollbackInProgress = "RollbackInProgress"
        case rollbackSuccessful = "RollbackSuccessful"
        case successful = "Successful"
        public var description: String { return self.rawValue }
    }

    public enum LifecycleState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case detached = "Detached"
        case detaching = "Detaching"
        case enteringStandby = "EnteringStandby"
        case inService = "InService"
        case pending = "Pending"
        case pendingProceed = "Pending:Proceed"
        case pendingWait = "Pending:Wait"
        case quarantined = "Quarantined"
        case standby = "Standby"
        case terminated = "Terminated"
        case terminating = "Terminating"
        case terminatingProceed = "Terminating:Proceed"
        case terminatingWait = "Terminating:Wait"
        case warmedHibernated = "Warmed:Hibernated"
        case warmedPending = "Warmed:Pending"
        case warmedPendingProceed = "Warmed:Pending:Proceed"
        case warmedPendingWait = "Warmed:Pending:Wait"
        case warmedRunning = "Warmed:Running"
        case warmedStopped = "Warmed:Stopped"
        case warmedTerminated = "Warmed:Terminated"
        case warmedTerminating = "Warmed:Terminating"
        case warmedTerminatingProceed = "Warmed:Terminating:Proceed"
        case warmedTerminatingWait = "Warmed:Terminating:Wait"
        public var description: String { return self.rawValue }
    }

    public enum LocalStorage: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case excluded = "excluded"
        case included = "included"
        case required = "required"
        public var description: String { return self.rawValue }
    }

    public enum LocalStorageType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case hdd = "hdd"
        case ssd = "ssd"
        public var description: String { return self.rawValue }
    }

    public enum MetricStatistic: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case average = "Average"
        case maximum = "Maximum"
        case minimum = "Minimum"
        case sampleCount = "SampleCount"
        case sum = "Sum"
        public var description: String { return self.rawValue }
    }

    public enum MetricType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case albRequestCountPerTarget = "ALBRequestCountPerTarget"
        case asgAverageCPUUtilization = "ASGAverageCPUUtilization"
        case asgAverageNetworkIn = "ASGAverageNetworkIn"
        case asgAverageNetworkOut = "ASGAverageNetworkOut"
        public var description: String { return self.rawValue }
    }

    public enum PredefinedLoadMetricType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case albTargetGroupRequestCount = "ALBTargetGroupRequestCount"
        case asgTotalCPUUtilization = "ASGTotalCPUUtilization"
        case asgTotalNetworkIn = "ASGTotalNetworkIn"
        case asgTotalNetworkOut = "ASGTotalNetworkOut"
        public var description: String { return self.rawValue }
    }

    public enum PredefinedMetricPairType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case albRequestCount = "ALBRequestCount"
        case asgNetworkIn = "ASGNetworkIn"
        case asgNetworkOut = "ASGNetworkOut"
        case asgcpuUtilization = "ASGCPUUtilization"
        public var description: String { return self.rawValue }
    }

    public enum PredefinedScalingMetricType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case albRequestCountPerTarget = "ALBRequestCountPerTarget"
        case asgAverageCPUUtilization = "ASGAverageCPUUtilization"
        case asgAverageNetworkIn = "ASGAverageNetworkIn"
        case asgAverageNetworkOut = "ASGAverageNetworkOut"
        public var description: String { return self.rawValue }
    }

    public enum PredictiveScalingMaxCapacityBreachBehavior: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case honorMaxCapacity = "HonorMaxCapacity"
        case increaseMaxCapacity = "IncreaseMaxCapacity"
        public var description: String { return self.rawValue }
    }

    public enum PredictiveScalingMode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case forecastAndScale = "ForecastAndScale"
        case forecastOnly = "ForecastOnly"
        public var description: String { return self.rawValue }
    }

    public enum RefreshStrategy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case rolling = "Rolling"
        public var description: String { return self.rawValue }
    }

    public enum ScaleInProtectedInstances: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ignore = "Ignore"
        case refresh = "Refresh"
        case wait = "Wait"
        public var description: String { return self.rawValue }
    }

    public enum ScalingActivityStatusCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancelled = "Cancelled"
        case failed = "Failed"
        case inProgress = "InProgress"
        case midLifecycleAction = "MidLifecycleAction"
        case pendingSpotBidPlacement = "PendingSpotBidPlacement"
        case preInService = "PreInService"
        case successful = "Successful"
        case waitingForConnectionDraining = "WaitingForConnectionDraining"
        case waitingForELBConnectionDraining = "WaitingForELBConnectionDraining"
        case waitingForInstanceId = "WaitingForInstanceId"
        case waitingForInstanceWarmup = "WaitingForInstanceWarmup"
        case waitingForSpotInstanceId = "WaitingForSpotInstanceId"
        case waitingForSpotInstanceRequestId = "WaitingForSpotInstanceRequestId"
        public var description: String { return self.rawValue }
    }

    public enum StandbyInstances: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case ignore = "Ignore"
        case terminate = "Terminate"
        case wait = "Wait"
        public var description: String { return self.rawValue }
    }

    public enum WarmPoolState: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case hibernated = "Hibernated"
        case running = "Running"
        case stopped = "Stopped"
        public var description: String { return self.rawValue }
    }

    public enum WarmPoolStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case pendingDelete = "PendingDelete"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AcceleratorCountRequest: AWSEncodableShape & AWSDecodableShape {
        /// The maximum value.
        public let max: Int?
        /// The minimum value.
        public let min: Int?

        @inlinable
        public init(max: Int? = nil, min: Int? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0)
            try self.validate(self.min, name: "min", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct AcceleratorTotalMemoryMiBRequest: AWSEncodableShape & AWSDecodableShape {
        /// The memory maximum in MiB.
        public let max: Int?
        /// The memory minimum in MiB.
        public let min: Int?

        @inlinable
        public init(max: Int? = nil, min: Int? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0)
            try self.validate(self.min, name: "min", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct ActivitiesType: AWSDecodableShape {
        /// The scaling activities. Activities are sorted by start time. Activities still in progress are described first.
        @OptionalCustomCoding<StandardArrayCoder<Activity>>
        public var activities: [Activity]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(activities: [Activity]? = nil, nextToken: String? = nil) {
            self.activities = activities
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case activities = "Activities"
            case nextToken = "NextToken"
        }
    }

    public struct Activity: AWSDecodableShape {
        /// The ID of the activity.
        public let activityId: String?
        /// The Amazon Resource Name (ARN) of the Auto Scaling group.
        public let autoScalingGroupARN: String?
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The state of the Auto Scaling group, which is either InService or Deleted.
        public let autoScalingGroupState: String?
        /// The reason the activity began.
        public let cause: String?
        /// A friendly, more verbose description of the activity.
        public let description: String?
        /// The details about the activity.
        public let details: String?
        /// The end time of the activity.
        public let endTime: Date?
        /// A value between 0 and 100 that indicates the progress of the activity.
        public let progress: Int?
        /// The start time of the activity.
        public let startTime: Date?
        /// The current status of the activity.
        public let statusCode: ScalingActivityStatusCode?
        /// A friendly, more verbose description of the activity status.
        public let statusMessage: String?

        @inlinable
        public init(activityId: String? = nil, autoScalingGroupARN: String? = nil, autoScalingGroupName: String? = nil, autoScalingGroupState: String? = nil, cause: String? = nil, description: String? = nil, details: String? = nil, endTime: Date? = nil, progress: Int? = nil, startTime: Date? = nil, statusCode: ScalingActivityStatusCode? = nil, statusMessage: String? = nil) {
            self.activityId = activityId
            self.autoScalingGroupARN = autoScalingGroupARN
            self.autoScalingGroupName = autoScalingGroupName
            self.autoScalingGroupState = autoScalingGroupState
            self.cause = cause
            self.description = description
            self.details = details
            self.endTime = endTime
            self.progress = progress
            self.startTime = startTime
            self.statusCode = statusCode
            self.statusMessage = statusMessage
        }

        private enum CodingKeys: String, CodingKey {
            case activityId = "ActivityId"
            case autoScalingGroupARN = "AutoScalingGroupARN"
            case autoScalingGroupName = "AutoScalingGroupName"
            case autoScalingGroupState = "AutoScalingGroupState"
            case cause = "Cause"
            case description = "Description"
            case details = "Details"
            case endTime = "EndTime"
            case progress = "Progress"
            case startTime = "StartTime"
            case statusCode = "StatusCode"
            case statusMessage = "StatusMessage"
        }
    }

    public struct ActivityType: AWSDecodableShape {
        /// A scaling activity.
        public let activity: Activity?

        @inlinable
        public init(activity: Activity? = nil) {
            self.activity = activity
        }

        private enum CodingKeys: String, CodingKey {
            case activity = "Activity"
        }
    }

    public struct AdjustmentType: AWSDecodableShape {
        /// The policy adjustment type. The valid values are ChangeInCapacity, ExactCapacity, and PercentChangeInCapacity.
        public let adjustmentType: String?

        @inlinable
        public init(adjustmentType: String? = nil) {
            self.adjustmentType = adjustmentType
        }

        private enum CodingKeys: String, CodingKey {
            case adjustmentType = "AdjustmentType"
        }
    }

    public struct Alarm: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the alarm.
        public let alarmARN: String?
        /// The name of the alarm.
        public let alarmName: String?

        @inlinable
        public init(alarmARN: String? = nil, alarmName: String? = nil) {
            self.alarmARN = alarmARN
            self.alarmName = alarmName
        }

        private enum CodingKeys: String, CodingKey {
            case alarmARN = "AlarmARN"
            case alarmName = "AlarmName"
        }
    }

    public struct AlarmSpecification: AWSEncodableShape & AWSDecodableShape {
        /// The names of one or more CloudWatch alarms to monitor for the instance refresh. You can specify up to 10 alarms.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var alarms: [String]?

        @inlinable
        public init(alarms: [String]? = nil) {
            self.alarms = alarms
        }

        public func validate(name: String) throws {
            try self.alarms?.forEach {
                try validate($0, name: "alarms[]", parent: name, max: 255)
                try validate($0, name: "alarms[]", parent: name, min: 1)
                try validate($0, name: "alarms[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case alarms = "Alarms"
        }
    }

    public struct AttachInstancesQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The IDs of the instances. You can specify up to 20 instances.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceIds: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceIds: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceIds = instanceIds
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, max: 19)
                try validate($0, name: "instanceIds[]", parent: name, min: 1)
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceIds = "InstanceIds"
        }
    }

    public struct AttachLoadBalancerTargetGroupsResultType: AWSDecodableShape {
        public init() {}
    }

    public struct AttachLoadBalancerTargetGroupsType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The Amazon Resource Names (ARNs) of the target groups. You can specify up to 10 target groups. To get the ARN of a target group, use the Elastic Load Balancing DescribeTargetGroups API operation.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var targetGroupARNs: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, targetGroupARNs: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.targetGroupARNs = targetGroupARNs
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.targetGroupARNs?.forEach {
                try validate($0, name: "targetGroupARNs[]", parent: name, max: 511)
                try validate($0, name: "targetGroupARNs[]", parent: name, min: 1)
                try validate($0, name: "targetGroupARNs[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case targetGroupARNs = "TargetGroupARNs"
        }
    }

    public struct AttachLoadBalancersResultType: AWSDecodableShape {
        public init() {}
    }

    public struct AttachLoadBalancersType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The names of the load balancers. You can specify up to 10 load balancers.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var loadBalancerNames: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, loadBalancerNames: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.loadBalancerNames = loadBalancerNames
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.loadBalancerNames?.forEach {
                try validate($0, name: "loadBalancerNames[]", parent: name, max: 255)
                try validate($0, name: "loadBalancerNames[]", parent: name, min: 1)
                try validate($0, name: "loadBalancerNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case loadBalancerNames = "LoadBalancerNames"
        }
    }

    public struct AttachTrafficSourcesResultType: AWSDecodableShape {
        public init() {}
    }

    public struct AttachTrafficSourcesType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        ///  If you enable zonal shift with cross-zone disabled load balancers, capacity could become imbalanced across Availability Zones. To skip the validation, specify true. For more information, see Auto Scaling group zonal shift in the Amazon EC2 Auto Scaling User Guide.
        public let skipZonalShiftValidation: Bool?
        /// The unique identifiers of one or more traffic sources. You can specify up to 10 traffic sources.
        @OptionalCustomCoding<StandardArrayCoder<TrafficSourceIdentifier>>
        public var trafficSources: [TrafficSourceIdentifier]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, skipZonalShiftValidation: Bool? = nil, trafficSources: [TrafficSourceIdentifier]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.skipZonalShiftValidation = skipZonalShiftValidation
            self.trafficSources = trafficSources
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.trafficSources?.forEach {
                try $0.validate(name: "\(name).trafficSources[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case skipZonalShiftValidation = "SkipZonalShiftValidation"
            case trafficSources = "TrafficSources"
        }
    }

    public struct AutoScalingGroup: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the Auto Scaling group.
        public let autoScalingGroupARN: String?
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        ///  The instance capacity distribution across Availability Zones.
        public let availabilityZoneDistribution: AvailabilityZoneDistribution?
        ///  The Availability Zone impairment policy.
        public let availabilityZoneImpairmentPolicy: AvailabilityZoneImpairmentPolicy?
        /// One or more Availability Zones for the group.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var availabilityZones: [String]?
        /// Indicates whether Capacity Rebalancing is enabled.
        public let capacityRebalance: Bool?
        ///  The capacity reservation specification.
        public let capacityReservationSpecification: CapacityReservationSpecification?
        /// Reserved.
        public let context: String?
        /// The date and time the group was created.
        public let createdTime: Date?
        /// The duration of the default cooldown period, in seconds.
        public let defaultCooldown: Int?
        /// The duration of the default instance warmup, in seconds.
        public let defaultInstanceWarmup: Int?
        /// The desired size of the group.
        public let desiredCapacity: Int?
        /// The unit of measurement for the value specified for desired capacity. Amazon EC2 Auto Scaling supports DesiredCapacityType for attribute-based instance type selection only.
        public let desiredCapacityType: String?
        /// The metrics enabled for the group.
        @OptionalCustomCoding<StandardArrayCoder<EnabledMetric>>
        public var enabledMetrics: [EnabledMetric]?
        /// The duration of the health check grace period, in seconds.
        public let healthCheckGracePeriod: Int?
        /// A comma-separated value string of one or more health check types.
        public let healthCheckType: String?
        /// An instance maintenance policy.
        public let instanceMaintenancePolicy: InstanceMaintenancePolicy?
        /// The EC2 instances associated with the group.
        @OptionalCustomCoding<StandardArrayCoder<Instance>>
        public var instances: [Instance]?
        /// The name of the associated launch configuration.
        public let launchConfigurationName: String?
        /// The launch template for the group.
        public let launchTemplate: LaunchTemplateSpecification?
        /// One or more load balancers associated with the group.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var loadBalancerNames: [String]?
        /// The maximum amount of time, in seconds, that an instance can be in service. Valid Range: Minimum value of 0.
        public let maxInstanceLifetime: Int?
        /// The maximum size of the group.
        public let maxSize: Int?
        /// The minimum size of the group.
        public let minSize: Int?
        /// The mixed instances policy for the group.
        public let mixedInstancesPolicy: MixedInstancesPolicy?
        /// Indicates whether newly launched instances are protected from termination by Amazon EC2 Auto Scaling when scaling in. For more information about preventing instances from terminating on scale in,  see Use instance scale-in protection in the Amazon EC2 Auto Scaling User Guide.
        public let newInstancesProtectedFromScaleIn: Bool?
        /// The name of the placement group into which to launch your instances, if any.
        public let placementGroup: String?
        /// The predicted capacity of the group when it has a predictive scaling policy.
        public let predictedCapacity: Int?
        /// The Amazon Resource Name (ARN) of the service-linked role that the Auto Scaling group uses to call other Amazon Web Services on your behalf.
        public let serviceLinkedRoleARN: String?
        /// The current state of the group when the DeleteAutoScalingGroup operation is in progress.
        public let status: String?
        /// The suspended processes associated with the group.
        @OptionalCustomCoding<StandardArrayCoder<SuspendedProcess>>
        public var suspendedProcesses: [SuspendedProcess]?
        /// The tags for the group.
        @OptionalCustomCoding<StandardArrayCoder<TagDescription>>
        public var tags: [TagDescription]?
        /// The Amazon Resource Names (ARN) of the target groups for your load balancer.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var targetGroupARNs: [String]?
        /// The termination policies for the group.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var terminationPolicies: [String]?
        /// The traffic sources associated with this Auto Scaling group.
        @OptionalCustomCoding<StandardArrayCoder<TrafficSourceIdentifier>>
        public var trafficSources: [TrafficSourceIdentifier]?
        /// One or more subnet IDs, if applicable, separated by commas.
        public let vpcZoneIdentifier: String?
        /// The warm pool for the group.
        public let warmPoolConfiguration: WarmPoolConfiguration?
        /// The current size of the warm pool.
        public let warmPoolSize: Int?

        @inlinable
        public init(autoScalingGroupARN: String? = nil, autoScalingGroupName: String? = nil, availabilityZoneDistribution: AvailabilityZoneDistribution? = nil, availabilityZoneImpairmentPolicy: AvailabilityZoneImpairmentPolicy? = nil, availabilityZones: [String]? = nil, capacityRebalance: Bool? = nil, capacityReservationSpecification: CapacityReservationSpecification? = nil, context: String? = nil, createdTime: Date? = nil, defaultCooldown: Int? = nil, defaultInstanceWarmup: Int? = nil, desiredCapacity: Int? = nil, desiredCapacityType: String? = nil, enabledMetrics: [EnabledMetric]? = nil, healthCheckGracePeriod: Int? = nil, healthCheckType: String? = nil, instanceMaintenancePolicy: InstanceMaintenancePolicy? = nil, instances: [Instance]? = nil, launchConfigurationName: String? = nil, launchTemplate: LaunchTemplateSpecification? = nil, loadBalancerNames: [String]? = nil, maxInstanceLifetime: Int? = nil, maxSize: Int? = nil, minSize: Int? = nil, mixedInstancesPolicy: MixedInstancesPolicy? = nil, newInstancesProtectedFromScaleIn: Bool? = nil, placementGroup: String? = nil, predictedCapacity: Int? = nil, serviceLinkedRoleARN: String? = nil, status: String? = nil, suspendedProcesses: [SuspendedProcess]? = nil, tags: [TagDescription]? = nil, targetGroupARNs: [String]? = nil, terminationPolicies: [String]? = nil, trafficSources: [TrafficSourceIdentifier]? = nil, vpcZoneIdentifier: String? = nil, warmPoolConfiguration: WarmPoolConfiguration? = nil, warmPoolSize: Int? = nil) {
            self.autoScalingGroupARN = autoScalingGroupARN
            self.autoScalingGroupName = autoScalingGroupName
            self.availabilityZoneDistribution = availabilityZoneDistribution
            self.availabilityZoneImpairmentPolicy = availabilityZoneImpairmentPolicy
            self.availabilityZones = availabilityZones
            self.capacityRebalance = capacityRebalance
            self.capacityReservationSpecification = capacityReservationSpecification
            self.context = context
            self.createdTime = createdTime
            self.defaultCooldown = defaultCooldown
            self.defaultInstanceWarmup = defaultInstanceWarmup
            self.desiredCapacity = desiredCapacity
            self.desiredCapacityType = desiredCapacityType
            self.enabledMetrics = enabledMetrics
            self.healthCheckGracePeriod = healthCheckGracePeriod
            self.healthCheckType = healthCheckType
            self.instanceMaintenancePolicy = instanceMaintenancePolicy
            self.instances = instances
            self.launchConfigurationName = launchConfigurationName
            self.launchTemplate = launchTemplate
            self.loadBalancerNames = loadBalancerNames
            self.maxInstanceLifetime = maxInstanceLifetime
            self.maxSize = maxSize
            self.minSize = minSize
            self.mixedInstancesPolicy = mixedInstancesPolicy
            self.newInstancesProtectedFromScaleIn = newInstancesProtectedFromScaleIn
            self.placementGroup = placementGroup
            self.predictedCapacity = predictedCapacity
            self.serviceLinkedRoleARN = serviceLinkedRoleARN
            self.status = status
            self.suspendedProcesses = suspendedProcesses
            self.tags = tags
            self.targetGroupARNs = targetGroupARNs
            self.terminationPolicies = terminationPolicies
            self.trafficSources = trafficSources
            self.vpcZoneIdentifier = vpcZoneIdentifier
            self.warmPoolConfiguration = warmPoolConfiguration
            self.warmPoolSize = warmPoolSize
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupARN = "AutoScalingGroupARN"
            case autoScalingGroupName = "AutoScalingGroupName"
            case availabilityZoneDistribution = "AvailabilityZoneDistribution"
            case availabilityZoneImpairmentPolicy = "AvailabilityZoneImpairmentPolicy"
            case availabilityZones = "AvailabilityZones"
            case capacityRebalance = "CapacityRebalance"
            case capacityReservationSpecification = "CapacityReservationSpecification"
            case context = "Context"
            case createdTime = "CreatedTime"
            case defaultCooldown = "DefaultCooldown"
            case defaultInstanceWarmup = "DefaultInstanceWarmup"
            case desiredCapacity = "DesiredCapacity"
            case desiredCapacityType = "DesiredCapacityType"
            case enabledMetrics = "EnabledMetrics"
            case healthCheckGracePeriod = "HealthCheckGracePeriod"
            case healthCheckType = "HealthCheckType"
            case instanceMaintenancePolicy = "InstanceMaintenancePolicy"
            case instances = "Instances"
            case launchConfigurationName = "LaunchConfigurationName"
            case launchTemplate = "LaunchTemplate"
            case loadBalancerNames = "LoadBalancerNames"
            case maxInstanceLifetime = "MaxInstanceLifetime"
            case maxSize = "MaxSize"
            case minSize = "MinSize"
            case mixedInstancesPolicy = "MixedInstancesPolicy"
            case newInstancesProtectedFromScaleIn = "NewInstancesProtectedFromScaleIn"
            case placementGroup = "PlacementGroup"
            case predictedCapacity = "PredictedCapacity"
            case serviceLinkedRoleARN = "ServiceLinkedRoleARN"
            case status = "Status"
            case suspendedProcesses = "SuspendedProcesses"
            case tags = "Tags"
            case targetGroupARNs = "TargetGroupARNs"
            case terminationPolicies = "TerminationPolicies"
            case trafficSources = "TrafficSources"
            case vpcZoneIdentifier = "VPCZoneIdentifier"
            case warmPoolConfiguration = "WarmPoolConfiguration"
            case warmPoolSize = "WarmPoolSize"
        }
    }

    public struct AutoScalingGroupNamesType: AWSEncodableShape {
        /// The names of the Auto Scaling groups. By default, you can only specify up to 50 names. You can optionally increase this limit using the MaxRecords property. If you omit this property, all Auto Scaling groups are described.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var autoScalingGroupNames: [String]?
        /// One or more filters to limit the results based on specific tags.
        @OptionalCustomCoding<StandardArrayCoder<Filter>>
        public var filters: [Filter]?
        ///  Specifies whether to include information about Amazon EC2 instances in the response. When set to true (default), the response includes instance details.
        public let includeInstances: Bool?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroupNames: [String]? = nil, filters: [Filter]? = nil, includeInstances: Bool? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.autoScalingGroupNames = autoScalingGroupNames
            self.filters = filters
            self.includeInstances = includeInstances
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.autoScalingGroupNames?.forEach {
                try validate($0, name: "autoScalingGroupNames[]", parent: name, max: 255)
                try validate($0, name: "autoScalingGroupNames[]", parent: name, min: 1)
                try validate($0, name: "autoScalingGroupNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupNames = "AutoScalingGroupNames"
            case filters = "Filters"
            case includeInstances = "IncludeInstances"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct AutoScalingGroupsType: AWSDecodableShape {
        /// The groups.
        @OptionalCustomCoding<StandardArrayCoder<AutoScalingGroup>>
        public var autoScalingGroups: [AutoScalingGroup]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroups: [AutoScalingGroup]? = nil, nextToken: String? = nil) {
            self.autoScalingGroups = autoScalingGroups
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroups = "AutoScalingGroups"
            case nextToken = "NextToken"
        }
    }

    public struct AutoScalingInstanceDetails: AWSDecodableShape {
        /// The name of the Auto Scaling group for the instance.
        public let autoScalingGroupName: String?
        /// The Availability Zone for the instance.
        public let availabilityZone: String?
        /// The last reported health status of this instance. Healthy means that the instance is healthy and should remain in service. Unhealthy means that the instance is unhealthy and Amazon EC2 Auto Scaling should terminate and replace it.
        public let healthStatus: String?
        /// The ID of the instance.
        public let instanceId: String?
        /// The instance type of the EC2 instance.
        public let instanceType: String?
        /// The launch configuration used to launch the instance. This value is not available if you attached the instance to the Auto Scaling group.
        public let launchConfigurationName: String?
        /// The launch template for the instance.
        public let launchTemplate: LaunchTemplateSpecification?
        /// The lifecycle state for the instance. The Quarantined state is not used. For more information, see Amazon EC2 Auto Scaling instance lifecycle in the Amazon EC2 Auto Scaling User Guide.  Valid values: Pending | Pending:Wait | Pending:Proceed | Quarantined | InService | Terminating | Terminating:Wait | Terminating:Proceed | Terminated | Detaching | Detached | EnteringStandby | Standby | Warmed:Pending | Warmed:Pending:Wait | Warmed:Pending:Proceed | Warmed:Terminating | Warmed:Terminating:Wait | Warmed:Terminating:Proceed | Warmed:Terminated | Warmed:Stopped | Warmed:Running
        public let lifecycleState: String?
        /// Indicates whether the instance is protected from termination by Amazon EC2 Auto Scaling when scaling in.
        public let protectedFromScaleIn: Bool?
        /// The number of capacity units contributed by the instance based on its instance type. Valid Range: Minimum value of 1. Maximum value of 999.
        public let weightedCapacity: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, availabilityZone: String? = nil, healthStatus: String? = nil, instanceId: String? = nil, instanceType: String? = nil, launchConfigurationName: String? = nil, launchTemplate: LaunchTemplateSpecification? = nil, lifecycleState: String? = nil, protectedFromScaleIn: Bool? = nil, weightedCapacity: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.availabilityZone = availabilityZone
            self.healthStatus = healthStatus
            self.instanceId = instanceId
            self.instanceType = instanceType
            self.launchConfigurationName = launchConfigurationName
            self.launchTemplate = launchTemplate
            self.lifecycleState = lifecycleState
            self.protectedFromScaleIn = protectedFromScaleIn
            self.weightedCapacity = weightedCapacity
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case availabilityZone = "AvailabilityZone"
            case healthStatus = "HealthStatus"
            case instanceId = "InstanceId"
            case instanceType = "InstanceType"
            case launchConfigurationName = "LaunchConfigurationName"
            case launchTemplate = "LaunchTemplate"
            case lifecycleState = "LifecycleState"
            case protectedFromScaleIn = "ProtectedFromScaleIn"
            case weightedCapacity = "WeightedCapacity"
        }
    }

    public struct AutoScalingInstancesType: AWSDecodableShape {
        /// The instances.
        @OptionalCustomCoding<StandardArrayCoder<AutoScalingInstanceDetails>>
        public var autoScalingInstances: [AutoScalingInstanceDetails]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(autoScalingInstances: [AutoScalingInstanceDetails]? = nil, nextToken: String? = nil) {
            self.autoScalingInstances = autoScalingInstances
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingInstances = "AutoScalingInstances"
            case nextToken = "NextToken"
        }
    }

    public struct AvailabilityZoneDistribution: AWSEncodableShape & AWSDecodableShape {
        ///  If launches fail in an Availability Zone, the following strategies are available. The default is balanced-best-effort.     balanced-only - If launches fail in an Availability Zone, Auto Scaling will continue to attempt to launch in the unhealthy zone to preserve a balanced distribution.    balanced-best-effort - If launches fail in an Availability Zone, Auto Scaling will attempt to launch in another healthy Availability Zone instead.
        public let capacityDistributionStrategy: CapacityDistributionStrategy?

        @inlinable
        public init(capacityDistributionStrategy: CapacityDistributionStrategy? = nil) {
            self.capacityDistributionStrategy = capacityDistributionStrategy
        }

        private enum CodingKeys: String, CodingKey {
            case capacityDistributionStrategy = "CapacityDistributionStrategy"
        }
    }

    public struct AvailabilityZoneImpairmentPolicy: AWSEncodableShape & AWSDecodableShape {
        ///  Specifies the health check behavior for the impaired Availability Zone in an active zonal shift. If you select Replace unhealthy, instances that appear unhealthy will be replaced in all Availability Zones.  If you select Ignore unhealthy, instances will not be replaced in the Availability Zone with the active zonal shift. For more information, see Auto Scaling group zonal shift  in the Amazon EC2 Auto Scaling User Guide.
        public let impairedZoneHealthCheckBehavior: ImpairedZoneHealthCheckBehavior?
        ///  If true, enable zonal shift for your Auto Scaling group.
        public let zonalShiftEnabled: Bool?

        @inlinable
        public init(impairedZoneHealthCheckBehavior: ImpairedZoneHealthCheckBehavior? = nil, zonalShiftEnabled: Bool? = nil) {
            self.impairedZoneHealthCheckBehavior = impairedZoneHealthCheckBehavior
            self.zonalShiftEnabled = zonalShiftEnabled
        }

        private enum CodingKeys: String, CodingKey {
            case impairedZoneHealthCheckBehavior = "ImpairedZoneHealthCheckBehavior"
            case zonalShiftEnabled = "ZonalShiftEnabled"
        }
    }

    public struct BaselineEbsBandwidthMbpsRequest: AWSEncodableShape & AWSDecodableShape {
        /// The maximum value in Mbps.
        public let max: Int?
        /// The minimum value in Mbps.
        public let min: Int?

        @inlinable
        public init(max: Int? = nil, min: Int? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0)
            try self.validate(self.min, name: "min", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct BaselinePerformanceFactorsRequest: AWSEncodableShape & AWSDecodableShape {
        ///  The CPU performance to consider, using an instance family as the baseline reference.
        public let cpu: CpuPerformanceFactorRequest?

        @inlinable
        public init(cpu: CpuPerformanceFactorRequest? = nil) {
            self.cpu = cpu
        }

        private enum CodingKeys: String, CodingKey {
            case cpu = "Cpu"
        }
    }

    public struct BatchDeleteScheduledActionAnswer: AWSDecodableShape {
        /// The names of the scheduled actions that could not be deleted, including an error message.
        @OptionalCustomCoding<StandardArrayCoder<FailedScheduledUpdateGroupActionRequest>>
        public var failedScheduledActions: [FailedScheduledUpdateGroupActionRequest]?

        @inlinable
        public init(failedScheduledActions: [FailedScheduledUpdateGroupActionRequest]? = nil) {
            self.failedScheduledActions = failedScheduledActions
        }

        private enum CodingKeys: String, CodingKey {
            case failedScheduledActions = "FailedScheduledActions"
        }
    }

    public struct BatchDeleteScheduledActionType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The names of the scheduled actions to delete. The maximum number allowed is 50.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var scheduledActionNames: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, scheduledActionNames: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.scheduledActionNames = scheduledActionNames
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.scheduledActionNames?.forEach {
                try validate($0, name: "scheduledActionNames[]", parent: name, max: 255)
                try validate($0, name: "scheduledActionNames[]", parent: name, min: 1)
                try validate($0, name: "scheduledActionNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case scheduledActionNames = "ScheduledActionNames"
        }
    }

    public struct BatchPutScheduledUpdateGroupActionAnswer: AWSDecodableShape {
        /// The names of the scheduled actions that could not be created or updated, including an error message.
        @OptionalCustomCoding<StandardArrayCoder<FailedScheduledUpdateGroupActionRequest>>
        public var failedScheduledUpdateGroupActions: [FailedScheduledUpdateGroupActionRequest]?

        @inlinable
        public init(failedScheduledUpdateGroupActions: [FailedScheduledUpdateGroupActionRequest]? = nil) {
            self.failedScheduledUpdateGroupActions = failedScheduledUpdateGroupActions
        }

        private enum CodingKeys: String, CodingKey {
            case failedScheduledUpdateGroupActions = "FailedScheduledUpdateGroupActions"
        }
    }

    public struct BatchPutScheduledUpdateGroupActionType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// One or more scheduled actions. The maximum number allowed is 50.
        @OptionalCustomCoding<StandardArrayCoder<ScheduledUpdateGroupActionRequest>>
        public var scheduledUpdateGroupActions: [ScheduledUpdateGroupActionRequest]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, scheduledUpdateGroupActions: [ScheduledUpdateGroupActionRequest]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.scheduledUpdateGroupActions = scheduledUpdateGroupActions
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.scheduledUpdateGroupActions?.forEach {
                try $0.validate(name: "\(name).scheduledUpdateGroupActions[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case scheduledUpdateGroupActions = "ScheduledUpdateGroupActions"
        }
    }

    public struct BlockDeviceMapping: AWSEncodableShape & AWSDecodableShape {
        /// The device name assigned to the volume (for example, /dev/sdh or xvdh). For more information, see Device naming on Linux instances in the Amazon EC2 User Guide.  To define a block device mapping, set the device name and exactly one of the following properties: Ebs, NoDevice, or VirtualName.
        public let deviceName: String?
        /// Information to attach an EBS volume to an instance at launch.
        public let ebs: Ebs?
        /// Setting this value to true prevents a volume that is included in the block device mapping of the AMI from being mapped to the specified device name at launch. If NoDevice is true for the root device, instances might fail the EC2 health check. In that case, Amazon EC2 Auto Scaling launches replacement instances.
        public let noDevice: Bool?
        /// The name of the instance store volume (virtual device) to attach to an instance at launch. The name must be in the form ephemeralX where X is a number starting from zero (0), for example, ephemeral0.
        public let virtualName: String?

        @inlinable
        public init(deviceName: String? = nil, ebs: Ebs? = nil, noDevice: Bool? = nil, virtualName: String? = nil) {
            self.deviceName = deviceName
            self.ebs = ebs
            self.noDevice = noDevice
            self.virtualName = virtualName
        }

        public func validate(name: String) throws {
            try self.validate(self.deviceName, name: "deviceName", parent: name, max: 255)
            try self.validate(self.deviceName, name: "deviceName", parent: name, min: 1)
            try self.validate(self.deviceName, name: "deviceName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.ebs?.validate(name: "\(name).ebs")
            try self.validate(self.virtualName, name: "virtualName", parent: name, max: 255)
            try self.validate(self.virtualName, name: "virtualName", parent: name, min: 1)
            try self.validate(self.virtualName, name: "virtualName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case deviceName = "DeviceName"
            case ebs = "Ebs"
            case noDevice = "NoDevice"
            case virtualName = "VirtualName"
        }
    }

    public struct CancelInstanceRefreshAnswer: AWSDecodableShape {
        /// The instance refresh ID associated with the request. This is the unique ID assigned to the instance refresh when it was started.
        public let instanceRefreshId: String?

        @inlinable
        public init(instanceRefreshId: String? = nil) {
            self.instanceRefreshId = instanceRefreshId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceRefreshId = "InstanceRefreshId"
        }
    }

    public struct CancelInstanceRefreshType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
        }
    }

    public struct CapacityForecast: AWSDecodableShape {
        /// The timestamps for the data points, in UTC format.
        @OptionalCustomCoding<StandardArrayCoder<Date>>
        public var timestamps: [Date]?
        /// The values of the data points.
        @OptionalCustomCoding<StandardArrayCoder<Double>>
        public var values: [Double]?

        @inlinable
        public init(timestamps: [Date]? = nil, values: [Double]? = nil) {
            self.timestamps = timestamps
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case timestamps = "Timestamps"
            case values = "Values"
        }
    }

    public struct CapacityReservationSpecification: AWSEncodableShape & AWSDecodableShape {
        ///  The capacity reservation preference. The following options are available:     capacity-reservations-only - Auto Scaling will only launch instances into a Capacity Reservation or Capacity Reservation resource group. If capacity isn't available, instances will fail to launch.    capacity-reservations-first - Auto Scaling will try to launch instances into a Capacity Reservation or Capacity Reservation resource group first. If capacity isn't available, instances will run in On-Demand capacity.    none - Auto Scaling will not launch instances into a Capacity Reservation. Instances will run in On-Demand capacity.     default - Auto Scaling uses the Capacity Reservation preference from your launch template or an open Capacity Reservation.
        public let capacityReservationPreference: CapacityReservationPreference?
        ///  Describes a target Capacity Reservation or Capacity Reservation resource group.
        public let capacityReservationTarget: CapacityReservationTarget?

        @inlinable
        public init(capacityReservationPreference: CapacityReservationPreference? = nil, capacityReservationTarget: CapacityReservationTarget? = nil) {
            self.capacityReservationPreference = capacityReservationPreference
            self.capacityReservationTarget = capacityReservationTarget
        }

        public func validate(name: String) throws {
            try self.capacityReservationTarget?.validate(name: "\(name).capacityReservationTarget")
        }

        private enum CodingKeys: String, CodingKey {
            case capacityReservationPreference = "CapacityReservationPreference"
            case capacityReservationTarget = "CapacityReservationTarget"
        }
    }

    public struct CapacityReservationTarget: AWSEncodableShape & AWSDecodableShape {
        ///  The Capacity Reservation IDs to launch instances into.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var capacityReservationIds: [String]?
        ///  The resource group ARNs of the Capacity Reservation to launch instances into.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var capacityReservationResourceGroupArns: [String]?

        @inlinable
        public init(capacityReservationIds: [String]? = nil, capacityReservationResourceGroupArns: [String]? = nil) {
            self.capacityReservationIds = capacityReservationIds
            self.capacityReservationResourceGroupArns = capacityReservationResourceGroupArns
        }

        public func validate(name: String) throws {
            try self.capacityReservationIds?.forEach {
                try validate($0, name: "capacityReservationIds[]", parent: name, max: 255)
                try validate($0, name: "capacityReservationIds[]", parent: name, min: 1)
                try validate($0, name: "capacityReservationIds[]", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
            }
            try self.capacityReservationResourceGroupArns?.forEach {
                try validate($0, name: "capacityReservationResourceGroupArns[]", parent: name, max: 1600)
                try validate($0, name: "capacityReservationResourceGroupArns[]", parent: name, min: 1)
                try validate($0, name: "capacityReservationResourceGroupArns[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case capacityReservationIds = "CapacityReservationIds"
            case capacityReservationResourceGroupArns = "CapacityReservationResourceGroupArns"
        }
    }

    public struct CompleteLifecycleActionAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct CompleteLifecycleActionType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The ID of the instance.
        public let instanceId: String?
        /// The action for the group to take. You can specify either CONTINUE or ABANDON.
        public let lifecycleActionResult: String?
        /// A universally unique identifier (UUID) that identifies a specific lifecycle action associated with an instance. Amazon EC2 Auto Scaling sends this token to the notification target you specified when you created the lifecycle hook.
        public let lifecycleActionToken: String?
        /// The name of the lifecycle hook.
        public let lifecycleHookName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceId: String? = nil, lifecycleActionResult: String? = nil, lifecycleActionToken: String? = nil, lifecycleHookName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceId = instanceId
            self.lifecycleActionResult = lifecycleActionResult
            self.lifecycleActionToken = lifecycleActionToken
            self.lifecycleHookName = lifecycleHookName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 1600)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 19)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.lifecycleActionToken, name: "lifecycleActionToken", parent: name, max: 36)
            try self.validate(self.lifecycleActionToken, name: "lifecycleActionToken", parent: name, min: 36)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, max: 255)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, min: 1)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceId = "InstanceId"
            case lifecycleActionResult = "LifecycleActionResult"
            case lifecycleActionToken = "LifecycleActionToken"
            case lifecycleHookName = "LifecycleHookName"
        }
    }

    public struct CpuPerformanceFactorRequest: AWSEncodableShape & AWSDecodableShape {
        public struct _ReferencesEncoding: ArrayCoderProperties { public static let member = "item" }

        ///  Specify an instance family to use as the baseline reference for CPU performance. All instance types that match your specified attributes will be compared against the CPU performance of the referenced instance family, regardless of CPU manufacturer or architecture differences.   Currently only one instance family can be specified in the list.
        @OptionalCustomCoding<ArrayCoder<_ReferencesEncoding, PerformanceFactorReferenceRequest>>
        public var references: [PerformanceFactorReferenceRequest]?

        @inlinable
        public init(references: [PerformanceFactorReferenceRequest]? = nil) {
            self.references = references
        }

        private enum CodingKeys: String, CodingKey {
            case references = "Reference"
        }
    }

    public struct CreateAutoScalingGroupType: AWSEncodableShape {
        /// The name of the Auto Scaling group. This name must be unique per Region per account. The name can contain any ASCII character 33 to 126 including most punctuation characters, digits, and upper and lowercased letters.  You cannot use a colon (:) in the name.
        public let autoScalingGroupName: String?
        /// The instance capacity distribution across Availability Zones.
        public let availabilityZoneDistribution: AvailabilityZoneDistribution?
        ///  The policy for Availability Zone impairment.
        public let availabilityZoneImpairmentPolicy: AvailabilityZoneImpairmentPolicy?
        /// A list of Availability Zones where instances in the Auto Scaling group can be created. Used for launching into the default VPC subnet in each Availability Zone when not using the VPCZoneIdentifier property, or for attaching a network interface when an existing network interface ID is specified in a launch template.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var availabilityZones: [String]?
        /// Indicates whether Capacity Rebalancing is enabled. Otherwise, Capacity Rebalancing is disabled. When you turn on Capacity Rebalancing, Amazon EC2 Auto Scaling attempts to launch a Spot Instance whenever Amazon EC2 notifies that a Spot Instance is at an elevated risk of interruption. After launching a new instance, it then terminates an old instance. For more information, see Use Capacity Rebalancing to handle Amazon EC2 Spot Interruptions in the in the Amazon EC2 Auto Scaling User Guide.
        public let capacityRebalance: Bool?
        ///  The capacity reservation specification for the Auto Scaling group.
        public let capacityReservationSpecification: CapacityReservationSpecification?
        /// Reserved.
        public let context: String?
        ///  Only needed if you use simple scaling policies.  The amount of time, in seconds, between one scaling activity ending and another one starting due to simple scaling policies. For more information, see Scaling cooldowns for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide. Default: 300 seconds
        public let defaultCooldown: Int?
        /// The amount of time, in seconds, until a new instance is considered to have finished initializing and resource consumption to become stable after it enters the InService state.  During an instance refresh, Amazon EC2 Auto Scaling waits for the warm-up period after it replaces an instance before it moves on to replacing the next instance. Amazon EC2 Auto Scaling also waits for the warm-up period before aggregating the metrics for new instances with existing instances in the Amazon CloudWatch metrics that are used for scaling, resulting in more reliable usage data. For more information, see Set the default instance warmup for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.  To manage various warm-up settings at the group level, we recommend that you set the default instance warmup, even if it is set to 0 seconds. To remove a value that you previously set, include the property but specify -1 for the value. However, we strongly recommend keeping the default instance warmup enabled by specifying a value of 0 or other nominal value.  Default: None
        public let defaultInstanceWarmup: Int?
        /// The desired capacity is the initial capacity of the Auto Scaling group at the time of its creation and the capacity it attempts to maintain. It can scale beyond this capacity if you configure auto scaling. This number must be greater than or equal to the minimum size of the group and less than or equal to the maximum size of the group. If you do not specify a desired capacity, the default is the minimum size of the group.
        public let desiredCapacity: Int?
        /// The unit of measurement for the value specified for desired capacity. Amazon EC2 Auto Scaling supports DesiredCapacityType for attribute-based instance type selection only. For more information, see Create a mixed instances group using attribute-based instance type selection in the Amazon EC2 Auto Scaling User Guide. By default, Amazon EC2 Auto Scaling specifies units, which translates into number of instances. Valid values: units | vcpu | memory-mib
        public let desiredCapacityType: String?
        /// The amount of time, in seconds, that Amazon EC2 Auto Scaling waits before checking the health status of an EC2 instance that has come into service and marking it unhealthy due to a failed health check. This is useful if your instances do not immediately pass their health checks after they enter the InService state. For more information, see Set the health check grace period for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide. Default: 0 seconds
        public let healthCheckGracePeriod: Int?
        /// A comma-separated value string of one or more health check types. The valid values are EC2, EBS, ELB, and VPC_LATTICE. EC2 is the default health check and cannot be disabled. For more information, see Health checks for instances in an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide. Only specify EC2 if you must clear a value that was previously set.
        public let healthCheckType: String?
        /// The ID of the instance used to base the launch configuration on. If specified, Amazon EC2 Auto Scaling uses the configuration values from the specified instance to create a new launch configuration. To get the instance ID, use the Amazon EC2 DescribeInstances API operation. For more information, see Create an Auto Scaling group using parameters from an existing instance in the Amazon EC2 Auto Scaling User Guide.
        public let instanceId: String?
        /// An instance maintenance policy. For more information, see Set instance maintenance policy in the Amazon EC2 Auto Scaling User Guide.
        public let instanceMaintenancePolicy: InstanceMaintenancePolicy?
        /// The name of the launch configuration to use to launch instances.  Conditional: You must specify either a launch template (LaunchTemplate or MixedInstancesPolicy) or a launch configuration (LaunchConfigurationName or InstanceId).
        public let launchConfigurationName: String?
        /// Information used to specify the launch template and version to use to launch instances.  Conditional: You must specify either a launch template (LaunchTemplate or MixedInstancesPolicy) or a launch configuration (LaunchConfigurationName or InstanceId).  The launch template that is specified must be configured for use with an Auto Scaling group. For more information, see Create a launch template for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.
        public let launchTemplate: LaunchTemplateSpecification?
        /// One or more lifecycle hooks to add to the Auto Scaling group before instances are launched.
        @OptionalCustomCoding<StandardArrayCoder<LifecycleHookSpecification>>
        public var lifecycleHookSpecificationList: [LifecycleHookSpecification]?
        /// A list of Classic Load Balancers associated with this Auto Scaling group. For Application Load Balancers, Network Load Balancers, and Gateway Load Balancers, specify the TargetGroupARNs property instead.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var loadBalancerNames: [String]?
        /// The maximum amount of time, in seconds, that an instance can be in service. The default is null. If specified, the value must be either 0 or a number equal to or greater than 86,400 seconds (1 day). For more information, see Replace Auto Scaling instances based on maximum instance lifetime in the Amazon EC2 Auto Scaling User Guide.
        public let maxInstanceLifetime: Int?
        /// The maximum size of the group.  With a mixed instances policy that uses instance weighting, Amazon EC2 Auto Scaling may need to go above MaxSize to meet your capacity requirements. In this event, Amazon EC2 Auto Scaling will never go above MaxSize by more than your largest instance weight (weights that define how many units each instance contributes to the desired capacity of the group).
        public let maxSize: Int?
        /// The minimum size of the group.
        public let minSize: Int?
        /// The mixed instances policy. For more information, see Auto Scaling groups with multiple instance types and purchase options in the Amazon EC2 Auto Scaling User Guide.
        public let mixedInstancesPolicy: MixedInstancesPolicy?
        /// Indicates whether newly launched instances are protected from termination by Amazon EC2 Auto Scaling when scaling in. For more information about preventing instances from terminating on scale in, see Use instance scale-in protection in the Amazon EC2 Auto Scaling User Guide.
        public let newInstancesProtectedFromScaleIn: Bool?
        /// The name of the placement group into which to launch your instances. For more information, see Placement groups in the Amazon EC2 User Guide.  A cluster placement group is a logical grouping of instances within a single Availability Zone. You cannot specify multiple Availability Zones and a cluster placement group.
        public let placementGroup: String?
        /// The Amazon Resource Name (ARN) of the service-linked role that the Auto Scaling group uses to call other Amazon Web Services service on your behalf. By default, Amazon EC2 Auto Scaling uses a service-linked role named AWSServiceRoleForAutoScaling, which it creates if it does not exist. For more information, see Service-linked roles in the Amazon EC2 Auto Scaling User Guide.
        public let serviceLinkedRoleARN: String?
        ///  If you enable zonal shift with cross-zone disabled load balancers, capacity could become imbalanced across Availability Zones. To skip the validation, specify true. For more information, see Auto Scaling group zonal shift in the Amazon EC2 Auto Scaling User Guide.
        public let skipZonalShiftValidation: Bool?
        /// One or more tags. You can tag your Auto Scaling group and propagate the tags to the Amazon EC2 instances it launches. Tags are not propagated to Amazon EBS volumes. To add tags to Amazon EBS volumes, specify the tags in a launch template but use caution. If the launch template specifies an instance tag with a key that is also specified for the Auto Scaling group, Amazon EC2 Auto Scaling overrides the value of that instance tag with the value specified by the Auto Scaling group. For more information, see Tag Auto Scaling groups and instances in the Amazon EC2 Auto Scaling User Guide.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// The Amazon Resource Names (ARN) of the Elastic Load Balancing target groups to associate with the Auto Scaling group. Instances are registered as targets with the target groups. The target groups receive incoming traffic and route requests to one or more registered targets. For more information, see Use Elastic Load Balancing to distribute traffic across the instances in your Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var targetGroupARNs: [String]?
        /// A policy or a list of policies that are used to select the instance to terminate. These policies are executed in the order that you list them. For more information, see Configure termination policies for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide. Valid values: Default | AllocationStrategy | ClosestToNextInstanceHour | NewestInstance | OldestInstance | OldestLaunchConfiguration | OldestLaunchTemplate | arn:aws:lambda:region:account-id:function:my-function:my-alias
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var terminationPolicies: [String]?
        /// The list of traffic sources to attach to this Auto Scaling group. You can use any of the following as traffic sources for an Auto Scaling group: Classic Load Balancer, Application Load Balancer, Gateway Load Balancer, Network Load Balancer, and VPC Lattice.
        @OptionalCustomCoding<StandardArrayCoder<TrafficSourceIdentifier>>
        public var trafficSources: [TrafficSourceIdentifier]?
        /// A comma-separated list of subnet IDs for a virtual private cloud (VPC) where instances in the Auto Scaling group can be created. If you specify VPCZoneIdentifier with AvailabilityZones, the subnets that you specify must reside in those Availability Zones.
        public let vpcZoneIdentifier: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, availabilityZoneDistribution: AvailabilityZoneDistribution? = nil, availabilityZoneImpairmentPolicy: AvailabilityZoneImpairmentPolicy? = nil, availabilityZones: [String]? = nil, capacityRebalance: Bool? = nil, capacityReservationSpecification: CapacityReservationSpecification? = nil, context: String? = nil, defaultCooldown: Int? = nil, defaultInstanceWarmup: Int? = nil, desiredCapacity: Int? = nil, desiredCapacityType: String? = nil, healthCheckGracePeriod: Int? = nil, healthCheckType: String? = nil, instanceId: String? = nil, instanceMaintenancePolicy: InstanceMaintenancePolicy? = nil, launchConfigurationName: String? = nil, launchTemplate: LaunchTemplateSpecification? = nil, lifecycleHookSpecificationList: [LifecycleHookSpecification]? = nil, loadBalancerNames: [String]? = nil, maxInstanceLifetime: Int? = nil, maxSize: Int? = nil, minSize: Int? = nil, mixedInstancesPolicy: MixedInstancesPolicy? = nil, newInstancesProtectedFromScaleIn: Bool? = nil, placementGroup: String? = nil, serviceLinkedRoleARN: String? = nil, skipZonalShiftValidation: Bool? = nil, tags: [Tag]? = nil, targetGroupARNs: [String]? = nil, terminationPolicies: [String]? = nil, trafficSources: [TrafficSourceIdentifier]? = nil, vpcZoneIdentifier: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.availabilityZoneDistribution = availabilityZoneDistribution
            self.availabilityZoneImpairmentPolicy = availabilityZoneImpairmentPolicy
            self.availabilityZones = availabilityZones
            self.capacityRebalance = capacityRebalance
            self.capacityReservationSpecification = capacityReservationSpecification
            self.context = context
            self.defaultCooldown = defaultCooldown
            self.defaultInstanceWarmup = defaultInstanceWarmup
            self.desiredCapacity = desiredCapacity
            self.desiredCapacityType = desiredCapacityType
            self.healthCheckGracePeriod = healthCheckGracePeriod
            self.healthCheckType = healthCheckType
            self.instanceId = instanceId
            self.instanceMaintenancePolicy = instanceMaintenancePolicy
            self.launchConfigurationName = launchConfigurationName
            self.launchTemplate = launchTemplate
            self.lifecycleHookSpecificationList = lifecycleHookSpecificationList
            self.loadBalancerNames = loadBalancerNames
            self.maxInstanceLifetime = maxInstanceLifetime
            self.maxSize = maxSize
            self.minSize = minSize
            self.mixedInstancesPolicy = mixedInstancesPolicy
            self.newInstancesProtectedFromScaleIn = newInstancesProtectedFromScaleIn
            self.placementGroup = placementGroup
            self.serviceLinkedRoleARN = serviceLinkedRoleARN
            self.skipZonalShiftValidation = skipZonalShiftValidation
            self.tags = tags
            self.targetGroupARNs = targetGroupARNs
            self.terminationPolicies = terminationPolicies
            self.trafficSources = trafficSources
            self.vpcZoneIdentifier = vpcZoneIdentifier
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.availabilityZones?.forEach {
                try validate($0, name: "availabilityZones[]", parent: name, max: 255)
                try validate($0, name: "availabilityZones[]", parent: name, min: 1)
                try validate($0, name: "availabilityZones[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.capacityReservationSpecification?.validate(name: "\(name).capacityReservationSpecification")
            try self.validate(self.desiredCapacityType, name: "desiredCapacityType", parent: name, max: 255)
            try self.validate(self.desiredCapacityType, name: "desiredCapacityType", parent: name, min: 1)
            try self.validate(self.desiredCapacityType, name: "desiredCapacityType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.healthCheckType, name: "healthCheckType", parent: name, max: 32)
            try self.validate(self.healthCheckType, name: "healthCheckType", parent: name, min: 1)
            try self.validate(self.healthCheckType, name: "healthCheckType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 19)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceMaintenancePolicy?.validate(name: "\(name).instanceMaintenancePolicy")
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, max: 255)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, min: 1)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.launchTemplate?.validate(name: "\(name).launchTemplate")
            try self.lifecycleHookSpecificationList?.forEach {
                try $0.validate(name: "\(name).lifecycleHookSpecificationList[]")
            }
            try self.loadBalancerNames?.forEach {
                try validate($0, name: "loadBalancerNames[]", parent: name, max: 255)
                try validate($0, name: "loadBalancerNames[]", parent: name, min: 1)
                try validate($0, name: "loadBalancerNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.mixedInstancesPolicy?.validate(name: "\(name).mixedInstancesPolicy")
            try self.validate(self.placementGroup, name: "placementGroup", parent: name, max: 255)
            try self.validate(self.placementGroup, name: "placementGroup", parent: name, min: 1)
            try self.validate(self.placementGroup, name: "placementGroup", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.serviceLinkedRoleARN, name: "serviceLinkedRoleARN", parent: name, max: 1600)
            try self.validate(self.serviceLinkedRoleARN, name: "serviceLinkedRoleARN", parent: name, min: 1)
            try self.validate(self.serviceLinkedRoleARN, name: "serviceLinkedRoleARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.targetGroupARNs?.forEach {
                try validate($0, name: "targetGroupARNs[]", parent: name, max: 511)
                try validate($0, name: "targetGroupARNs[]", parent: name, min: 1)
                try validate($0, name: "targetGroupARNs[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.terminationPolicies?.forEach {
                try validate($0, name: "terminationPolicies[]", parent: name, max: 1600)
                try validate($0, name: "terminationPolicies[]", parent: name, min: 1)
                try validate($0, name: "terminationPolicies[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.trafficSources?.forEach {
                try $0.validate(name: "\(name).trafficSources[]")
            }
            try self.validate(self.vpcZoneIdentifier, name: "vpcZoneIdentifier", parent: name, max: 5000)
            try self.validate(self.vpcZoneIdentifier, name: "vpcZoneIdentifier", parent: name, min: 1)
            try self.validate(self.vpcZoneIdentifier, name: "vpcZoneIdentifier", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case availabilityZoneDistribution = "AvailabilityZoneDistribution"
            case availabilityZoneImpairmentPolicy = "AvailabilityZoneImpairmentPolicy"
            case availabilityZones = "AvailabilityZones"
            case capacityRebalance = "CapacityRebalance"
            case capacityReservationSpecification = "CapacityReservationSpecification"
            case context = "Context"
            case defaultCooldown = "DefaultCooldown"
            case defaultInstanceWarmup = "DefaultInstanceWarmup"
            case desiredCapacity = "DesiredCapacity"
            case desiredCapacityType = "DesiredCapacityType"
            case healthCheckGracePeriod = "HealthCheckGracePeriod"
            case healthCheckType = "HealthCheckType"
            case instanceId = "InstanceId"
            case instanceMaintenancePolicy = "InstanceMaintenancePolicy"
            case launchConfigurationName = "LaunchConfigurationName"
            case launchTemplate = "LaunchTemplate"
            case lifecycleHookSpecificationList = "LifecycleHookSpecificationList"
            case loadBalancerNames = "LoadBalancerNames"
            case maxInstanceLifetime = "MaxInstanceLifetime"
            case maxSize = "MaxSize"
            case minSize = "MinSize"
            case mixedInstancesPolicy = "MixedInstancesPolicy"
            case newInstancesProtectedFromScaleIn = "NewInstancesProtectedFromScaleIn"
            case placementGroup = "PlacementGroup"
            case serviceLinkedRoleARN = "ServiceLinkedRoleARN"
            case skipZonalShiftValidation = "SkipZonalShiftValidation"
            case tags = "Tags"
            case targetGroupARNs = "TargetGroupARNs"
            case terminationPolicies = "TerminationPolicies"
            case trafficSources = "TrafficSources"
            case vpcZoneIdentifier = "VPCZoneIdentifier"
        }
    }

    public struct CreateLaunchConfigurationType: AWSEncodableShape {
        /// Specifies whether to assign a public IPv4 address to the group's instances. If the instance is launched into a default subnet, the default is to assign a public IPv4 address, unless you disabled the option to assign a public IPv4 address on the subnet. If the instance is launched into a nondefault subnet, the default is not to assign a public IPv4 address, unless you enabled the option to assign a public IPv4 address on the subnet. If you specify true, each instance in the Auto Scaling group receives a unique public IPv4 address. For more information, see Provide network connectivity for your Auto Scaling instances using Amazon VPC in the Amazon EC2 Auto Scaling User Guide. If you specify this property, you must specify at least one subnet for VPCZoneIdentifier when you create your group.
        public let associatePublicIpAddress: Bool?
        /// The block device mapping entries that define the block devices to attach to the instances at launch. By default, the block devices specified in the block device mapping for the AMI are used. For more information, see Block device mappings in the Amazon EC2 User Guide.
        @OptionalCustomCoding<StandardArrayCoder<BlockDeviceMapping>>
        public var blockDeviceMappings: [BlockDeviceMapping]?
        /// Available for backward compatibility.
        public let classicLinkVPCId: String?
        /// Available for backward compatibility.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var classicLinkVPCSecurityGroups: [String]?
        /// Specifies whether the launch configuration is optimized for EBS I/O (true) or not (false). The optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal I/O performance. This optimization is not available with all instance types. Additional fees are incurred when you enable EBS optimization for an instance type that is not EBS-optimized by default. For more information, see Amazon EBS-optimized instances in the Amazon EC2 User Guide. The default value is false.
        public let ebsOptimized: Bool?
        /// The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. For more information, see IAM role for applications that run on Amazon EC2 instances in the Amazon EC2 Auto Scaling User Guide.
        public let iamInstanceProfile: String?
        /// The ID of the Amazon Machine Image (AMI) that was assigned during registration. For more information, see Find a Linux AMI in the Amazon EC2 User Guide. If you specify InstanceId, an ImageId is not required.
        public let imageId: String?
        /// The ID of the instance to use to create the launch configuration. The new launch configuration derives attributes from the instance, except for the block device mapping. To create a launch configuration with a block device mapping or override any other instance attributes, specify them as part of the same request. For more information, see Create a launch configuration in the Amazon EC2 Auto Scaling User Guide.
        public let instanceId: String?
        /// Controls whether instances in this group are launched with detailed (true) or basic (false) monitoring. The default value is true (enabled).  When detailed monitoring is enabled, Amazon CloudWatch generates metrics every minute and your account is charged a fee. When you disable detailed monitoring, CloudWatch generates metrics every 5 minutes. For more information, see Configure monitoring for Auto Scaling instances in the Amazon EC2 Auto Scaling User Guide.
        public let instanceMonitoring: InstanceMonitoring?
        /// Specifies the instance type of the EC2 instance. For information about available instance types, see Available instance types in the Amazon EC2 User Guide. If you specify InstanceId, an InstanceType is not required.
        public let instanceType: String?
        /// The ID of the kernel associated with the AMI.  We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see User provided kernels in the Amazon EC2 User Guide.
        public let kernelId: String?
        /// The name of the key pair. For more information, see Amazon EC2 key pairs and Amazon EC2 instances in the Amazon EC2 User Guide.
        public let keyName: String?
        /// The name of the launch configuration. This name must be unique per Region per account.
        public let launchConfigurationName: String?
        /// The metadata options for the instances. For more information, see Configure the instance metadata options in the Amazon EC2 Auto Scaling User Guide.
        public let metadataOptions: InstanceMetadataOptions?
        /// The tenancy of the instance, either default or dedicated. An instance with dedicated tenancy runs on isolated, single-tenant hardware and can only be launched into a VPC. To launch dedicated instances into a shared tenancy VPC (a VPC with the instance placement tenancy attribute set to default), you must set the value of this property to dedicated. If you specify PlacementTenancy, you must specify at least one subnet for VPCZoneIdentifier when you create your group. Valid values: default | dedicated
        public let placementTenancy: String?
        /// The ID of the RAM disk to select.  We recommend that you use PV-GRUB instead of kernels and RAM disks. For more information, see User provided kernels in the Amazon EC2 User Guide.
        public let ramdiskId: String?
        /// A list that contains the security group IDs to assign to the instances in the Auto Scaling group. For more information, see Control traffic to your Amazon Web Services resources using security groups in the Amazon Virtual Private Cloud User Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var securityGroups: [String]?
        /// The maximum hourly price to be paid for any Spot Instance launched to fulfill the request. Spot Instances are launched when the price you specify exceeds the current Spot price. For more information, see Request Spot Instances for fault-tolerant and flexible applications in the Amazon EC2 Auto Scaling User Guide. Valid Range: Minimum value of 0.001  When you change your maximum price by creating a new launch configuration, running instances will continue to run as long as the maximum price for those running instances is higher than the current Spot price.
        public let spotPrice: String?
        /// The user data to make available to the launched EC2 instances. For more information, see Instance metadata and user data (Linux) and Instance metadata and user data (Windows). If you are using a command line tool, base64-encoding is performed for you, and you can load the text from a file. Otherwise, you must provide base64-encoded text. User data is limited to 16 KB.
        public let userData: String?

        @inlinable
        public init(associatePublicIpAddress: Bool? = nil, blockDeviceMappings: [BlockDeviceMapping]? = nil, classicLinkVPCId: String? = nil, classicLinkVPCSecurityGroups: [String]? = nil, ebsOptimized: Bool? = nil, iamInstanceProfile: String? = nil, imageId: String? = nil, instanceId: String? = nil, instanceMonitoring: InstanceMonitoring? = nil, instanceType: String? = nil, kernelId: String? = nil, keyName: String? = nil, launchConfigurationName: String? = nil, metadataOptions: InstanceMetadataOptions? = nil, placementTenancy: String? = nil, ramdiskId: String? = nil, securityGroups: [String]? = nil, spotPrice: String? = nil, userData: String? = nil) {
            self.associatePublicIpAddress = associatePublicIpAddress
            self.blockDeviceMappings = blockDeviceMappings
            self.classicLinkVPCId = classicLinkVPCId
            self.classicLinkVPCSecurityGroups = classicLinkVPCSecurityGroups
            self.ebsOptimized = ebsOptimized
            self.iamInstanceProfile = iamInstanceProfile
            self.imageId = imageId
            self.instanceId = instanceId
            self.instanceMonitoring = instanceMonitoring
            self.instanceType = instanceType
            self.kernelId = kernelId
            self.keyName = keyName
            self.launchConfigurationName = launchConfigurationName
            self.metadataOptions = metadataOptions
            self.placementTenancy = placementTenancy
            self.ramdiskId = ramdiskId
            self.securityGroups = securityGroups
            self.spotPrice = spotPrice
            self.userData = userData
        }

        public func validate(name: String) throws {
            try self.blockDeviceMappings?.forEach {
                try $0.validate(name: "\(name).blockDeviceMappings[]")
            }
            try self.validate(self.classicLinkVPCId, name: "classicLinkVPCId", parent: name, max: 255)
            try self.validate(self.classicLinkVPCId, name: "classicLinkVPCId", parent: name, min: 1)
            try self.validate(self.classicLinkVPCId, name: "classicLinkVPCId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.classicLinkVPCSecurityGroups?.forEach {
                try validate($0, name: "classicLinkVPCSecurityGroups[]", parent: name, max: 255)
                try validate($0, name: "classicLinkVPCSecurityGroups[]", parent: name, min: 1)
                try validate($0, name: "classicLinkVPCSecurityGroups[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.iamInstanceProfile, name: "iamInstanceProfile", parent: name, max: 1600)
            try self.validate(self.iamInstanceProfile, name: "iamInstanceProfile", parent: name, min: 1)
            try self.validate(self.iamInstanceProfile, name: "iamInstanceProfile", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.imageId, name: "imageId", parent: name, max: 255)
            try self.validate(self.imageId, name: "imageId", parent: name, min: 1)
            try self.validate(self.imageId, name: "imageId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 19)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.instanceType, name: "instanceType", parent: name, max: 255)
            try self.validate(self.instanceType, name: "instanceType", parent: name, min: 1)
            try self.validate(self.instanceType, name: "instanceType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.kernelId, name: "kernelId", parent: name, max: 255)
            try self.validate(self.kernelId, name: "kernelId", parent: name, min: 1)
            try self.validate(self.kernelId, name: "kernelId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.keyName, name: "keyName", parent: name, max: 255)
            try self.validate(self.keyName, name: "keyName", parent: name, min: 1)
            try self.validate(self.keyName, name: "keyName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, max: 255)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, min: 1)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.metadataOptions?.validate(name: "\(name).metadataOptions")
            try self.validate(self.placementTenancy, name: "placementTenancy", parent: name, max: 64)
            try self.validate(self.placementTenancy, name: "placementTenancy", parent: name, min: 1)
            try self.validate(self.placementTenancy, name: "placementTenancy", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.ramdiskId, name: "ramdiskId", parent: name, max: 255)
            try self.validate(self.ramdiskId, name: "ramdiskId", parent: name, min: 1)
            try self.validate(self.ramdiskId, name: "ramdiskId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.securityGroups?.forEach {
                try validate($0, name: "securityGroups[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.spotPrice, name: "spotPrice", parent: name, max: 255)
            try self.validate(self.spotPrice, name: "spotPrice", parent: name, min: 1)
            try self.validate(self.userData, name: "userData", parent: name, max: 21847)
            try self.validate(self.userData, name: "userData", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case associatePublicIpAddress = "AssociatePublicIpAddress"
            case blockDeviceMappings = "BlockDeviceMappings"
            case classicLinkVPCId = "ClassicLinkVPCId"
            case classicLinkVPCSecurityGroups = "ClassicLinkVPCSecurityGroups"
            case ebsOptimized = "EbsOptimized"
            case iamInstanceProfile = "IamInstanceProfile"
            case imageId = "ImageId"
            case instanceId = "InstanceId"
            case instanceMonitoring = "InstanceMonitoring"
            case instanceType = "InstanceType"
            case kernelId = "KernelId"
            case keyName = "KeyName"
            case launchConfigurationName = "LaunchConfigurationName"
            case metadataOptions = "MetadataOptions"
            case placementTenancy = "PlacementTenancy"
            case ramdiskId = "RamdiskId"
            case securityGroups = "SecurityGroups"
            case spotPrice = "SpotPrice"
            case userData = "UserData"
        }
    }

    public struct CreateOrUpdateTagsType: AWSEncodableShape {
        /// One or more tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(tags: [Tag]? = nil) {
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct CustomizedMetricSpecification: AWSEncodableShape & AWSDecodableShape {
        /// The dimensions of the metric. Conditional: If you published your metric with dimensions, you must specify the same dimensions in your scaling policy.
        @OptionalCustomCoding<StandardArrayCoder<MetricDimension>>
        public var dimensions: [MetricDimension]?
        /// The name of the metric. To get the exact metric name, namespace, and dimensions, inspect the Metric object that is returned by a call to ListMetrics.
        public let metricName: String?
        /// The metrics to include in the target tracking scaling policy, as a metric data query. This can include both raw metric and metric math expressions.
        @OptionalCustomCoding<StandardArrayCoder<TargetTrackingMetricDataQuery>>
        public var metrics: [TargetTrackingMetricDataQuery]?
        /// The namespace of the metric.
        public let namespace: String?
        ///  The period of the metric in seconds. The default value is 60. Accepted values are 10, 30, and 60. For high resolution metric, set the value to less than 60. For more information, see Create a target tracking policy using high-resolution metrics for faster response.
        public let period: Int?
        /// The statistic of the metric.
        public let statistic: MetricStatistic?
        /// The unit of the metric. For a complete list of the units that CloudWatch supports, see the MetricDatum data type in the Amazon CloudWatch API Reference.
        public let unit: String?

        @inlinable
        public init(dimensions: [MetricDimension]? = nil, metricName: String? = nil, metrics: [TargetTrackingMetricDataQuery]? = nil, namespace: String? = nil, period: Int? = nil, statistic: MetricStatistic? = nil, unit: String? = nil) {
            self.dimensions = dimensions
            self.metricName = metricName
            self.metrics = metrics
            self.namespace = namespace
            self.period = period
            self.statistic = statistic
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.metrics?.forEach {
                try $0.validate(name: "\(name).metrics[]")
            }
            try self.validate(self.period, name: "period", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case dimensions = "Dimensions"
            case metricName = "MetricName"
            case metrics = "Metrics"
            case namespace = "Namespace"
            case period = "Period"
            case statistic = "Statistic"
            case unit = "Unit"
        }
    }

    public struct DeleteAutoScalingGroupType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// Specifies that the group is to be deleted along with all instances associated with the group, without waiting for all instances to be terminated. This action also deletes any outstanding lifecycle actions associated with the group.
        public let forceDelete: Bool?

        @inlinable
        public init(autoScalingGroupName: String? = nil, forceDelete: Bool? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.forceDelete = forceDelete
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case forceDelete = "ForceDelete"
        }
    }

    public struct DeleteLifecycleHookAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteLifecycleHookType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The name of the lifecycle hook.
        public let lifecycleHookName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, lifecycleHookName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.lifecycleHookName = lifecycleHookName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, max: 255)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, min: 1)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case lifecycleHookName = "LifecycleHookName"
        }
    }

    public struct DeleteNotificationConfigurationType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The Amazon Resource Name (ARN) of the Amazon SNS topic.
        public let topicARN: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, topicARN: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.topicARN = topicARN
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.topicARN, name: "topicARN", parent: name, max: 255)
            try self.validate(self.topicARN, name: "topicARN", parent: name, min: 1)
            try self.validate(self.topicARN, name: "topicARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case topicARN = "TopicARN"
        }
    }

    public struct DeletePolicyType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The name or Amazon Resource Name (ARN) of the policy.
        public let policyName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, policyName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.policyName = policyName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.policyName, name: "policyName", parent: name, max: 1600)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case policyName = "PolicyName"
        }
    }

    public struct DeleteScheduledActionType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The name of the action to delete.
        public let scheduledActionName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, scheduledActionName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.scheduledActionName = scheduledActionName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, max: 255)
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, min: 1)
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case scheduledActionName = "ScheduledActionName"
        }
    }

    public struct DeleteTagsType: AWSEncodableShape {
        /// One or more tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(tags: [Tag]? = nil) {
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct DeleteWarmPoolAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteWarmPoolType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// Specifies that the warm pool is to be deleted along with all of its associated instances, without waiting for all instances to be terminated. This parameter also deletes any outstanding lifecycle actions associated with the warm pool instances.
        public let forceDelete: Bool?

        @inlinable
        public init(autoScalingGroupName: String? = nil, forceDelete: Bool? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.forceDelete = forceDelete
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case forceDelete = "ForceDelete"
        }
    }

    public struct DescribeAccountLimitsAnswer: AWSDecodableShape {
        /// The maximum number of groups allowed for your account. The default is 200 groups per Region.
        public let maxNumberOfAutoScalingGroups: Int?
        /// The maximum number of launch configurations allowed for your account. The default is 200 launch configurations per Region.
        public let maxNumberOfLaunchConfigurations: Int?
        /// The current number of groups for your account.
        public let numberOfAutoScalingGroups: Int?
        /// The current number of launch configurations for your account.
        public let numberOfLaunchConfigurations: Int?

        @inlinable
        public init(maxNumberOfAutoScalingGroups: Int? = nil, maxNumberOfLaunchConfigurations: Int? = nil, numberOfAutoScalingGroups: Int? = nil, numberOfLaunchConfigurations: Int? = nil) {
            self.maxNumberOfAutoScalingGroups = maxNumberOfAutoScalingGroups
            self.maxNumberOfLaunchConfigurations = maxNumberOfLaunchConfigurations
            self.numberOfAutoScalingGroups = numberOfAutoScalingGroups
            self.numberOfLaunchConfigurations = numberOfLaunchConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case maxNumberOfAutoScalingGroups = "MaxNumberOfAutoScalingGroups"
            case maxNumberOfLaunchConfigurations = "MaxNumberOfLaunchConfigurations"
            case numberOfAutoScalingGroups = "NumberOfAutoScalingGroups"
            case numberOfLaunchConfigurations = "NumberOfLaunchConfigurations"
        }
    }

    public struct DescribeAdjustmentTypesAnswer: AWSDecodableShape {
        /// The policy adjustment types.
        @OptionalCustomCoding<StandardArrayCoder<AdjustmentType>>
        public var adjustmentTypes: [AdjustmentType]?

        @inlinable
        public init(adjustmentTypes: [AdjustmentType]? = nil) {
            self.adjustmentTypes = adjustmentTypes
        }

        private enum CodingKeys: String, CodingKey {
            case adjustmentTypes = "AdjustmentTypes"
        }
    }

    public struct DescribeAutoScalingInstancesType: AWSEncodableShape {
        /// The IDs of the instances. If you omit this property, all Auto Scaling instances are described. If you specify an ID that does not exist, it is ignored with no error. Array Members: Maximum number of 50 items.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceIds: [String]?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 50.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(instanceIds: [String]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.instanceIds = instanceIds
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, max: 19)
                try validate($0, name: "instanceIds[]", parent: name, min: 1)
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceIds = "InstanceIds"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeAutoScalingNotificationTypesAnswer: AWSDecodableShape {
        /// The notification types.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var autoScalingNotificationTypes: [String]?

        @inlinable
        public init(autoScalingNotificationTypes: [String]? = nil) {
            self.autoScalingNotificationTypes = autoScalingNotificationTypes
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingNotificationTypes = "AutoScalingNotificationTypes"
        }
    }

    public struct DescribeInstanceRefreshesAnswer: AWSDecodableShape {
        /// The instance refreshes for the specified group, sorted by creation timestamp in descending order.
        @OptionalCustomCoding<StandardArrayCoder<InstanceRefresh>>
        public var instanceRefreshes: [InstanceRefresh]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(instanceRefreshes: [InstanceRefresh]? = nil, nextToken: String? = nil) {
            self.instanceRefreshes = instanceRefreshes
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case instanceRefreshes = "InstanceRefreshes"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstanceRefreshesType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// One or more instance refresh IDs.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceRefreshIds: [String]?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceRefreshIds: [String]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceRefreshIds = instanceRefreshIds
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceRefreshIds?.forEach {
                try validate($0, name: "instanceRefreshIds[]", parent: name, max: 255)
                try validate($0, name: "instanceRefreshIds[]", parent: name, min: 1)
                try validate($0, name: "instanceRefreshIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceRefreshIds = "InstanceRefreshIds"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeLifecycleHookTypesAnswer: AWSDecodableShape {
        /// The lifecycle hook types.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var lifecycleHookTypes: [String]?

        @inlinable
        public init(lifecycleHookTypes: [String]? = nil) {
            self.lifecycleHookTypes = lifecycleHookTypes
        }

        private enum CodingKeys: String, CodingKey {
            case lifecycleHookTypes = "LifecycleHookTypes"
        }
    }

    public struct DescribeLifecycleHooksAnswer: AWSDecodableShape {
        /// The lifecycle hooks for the specified group.
        @OptionalCustomCoding<StandardArrayCoder<LifecycleHook>>
        public var lifecycleHooks: [LifecycleHook]?

        @inlinable
        public init(lifecycleHooks: [LifecycleHook]? = nil) {
            self.lifecycleHooks = lifecycleHooks
        }

        private enum CodingKeys: String, CodingKey {
            case lifecycleHooks = "LifecycleHooks"
        }
    }

    public struct DescribeLifecycleHooksType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The names of one or more lifecycle hooks. If you omit this property, all lifecycle hooks are described.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var lifecycleHookNames: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, lifecycleHookNames: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.lifecycleHookNames = lifecycleHookNames
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.lifecycleHookNames?.forEach {
                try validate($0, name: "lifecycleHookNames[]", parent: name, max: 255)
                try validate($0, name: "lifecycleHookNames[]", parent: name, min: 1)
                try validate($0, name: "lifecycleHookNames[]", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
            }
            try self.validate(self.lifecycleHookNames, name: "lifecycleHookNames", parent: name, max: 50)
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case lifecycleHookNames = "LifecycleHookNames"
        }
    }

    public struct DescribeLoadBalancerTargetGroupsRequest: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The maximum number of items to return with this call. The default value is 100 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeLoadBalancerTargetGroupsResponse: AWSDecodableShape {
        /// Information about the target groups.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancerTargetGroupState>>
        public var loadBalancerTargetGroups: [LoadBalancerTargetGroupState]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(loadBalancerTargetGroups: [LoadBalancerTargetGroupState]? = nil, nextToken: String? = nil) {
            self.loadBalancerTargetGroups = loadBalancerTargetGroups
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerTargetGroups = "LoadBalancerTargetGroups"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeLoadBalancersRequest: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The maximum number of items to return with this call. The default value is 100 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeLoadBalancersResponse: AWSDecodableShape {
        /// The load balancers.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancerState>>
        public var loadBalancers: [LoadBalancerState]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(loadBalancers: [LoadBalancerState]? = nil, nextToken: String? = nil) {
            self.loadBalancers = loadBalancers
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancers = "LoadBalancers"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeMetricCollectionTypesAnswer: AWSDecodableShape {
        /// The granularities for the metrics.
        @OptionalCustomCoding<StandardArrayCoder<MetricGranularityType>>
        public var granularities: [MetricGranularityType]?
        /// The metrics.
        @OptionalCustomCoding<StandardArrayCoder<MetricCollectionType>>
        public var metrics: [MetricCollectionType]?

        @inlinable
        public init(granularities: [MetricGranularityType]? = nil, metrics: [MetricCollectionType]? = nil) {
            self.granularities = granularities
            self.metrics = metrics
        }

        private enum CodingKeys: String, CodingKey {
            case granularities = "Granularities"
            case metrics = "Metrics"
        }
    }

    public struct DescribeNotificationConfigurationsAnswer: AWSDecodableShape {
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?
        /// The notification configurations.
        @OptionalCustomCoding<StandardArrayCoder<NotificationConfiguration>>
        public var notificationConfigurations: [NotificationConfiguration]?

        @inlinable
        public init(nextToken: String? = nil, notificationConfigurations: [NotificationConfiguration]? = nil) {
            self.nextToken = nextToken
            self.notificationConfigurations = notificationConfigurations
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case notificationConfigurations = "NotificationConfigurations"
        }
    }

    public struct DescribeNotificationConfigurationsType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var autoScalingGroupNames: [String]?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroupNames: [String]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.autoScalingGroupNames = autoScalingGroupNames
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.autoScalingGroupNames?.forEach {
                try validate($0, name: "autoScalingGroupNames[]", parent: name, max: 255)
                try validate($0, name: "autoScalingGroupNames[]", parent: name, min: 1)
                try validate($0, name: "autoScalingGroupNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupNames = "AutoScalingGroupNames"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribePoliciesType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The maximum number of items to be returned with each call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The names of one or more policies. If you omit this property, all policies are described. If a group name is provided, the results are limited to that group. If you specify an unknown policy name, it is ignored with no error. Array Members: Maximum number of 50 items.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var policyNames: [String]?
        /// One or more policy types. The valid values are SimpleScaling, StepScaling, TargetTrackingScaling, and PredictiveScaling.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var policyTypes: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil, policyNames: [String]? = nil, policyTypes: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
            self.policyNames = policyNames
            self.policyTypes = policyTypes
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.policyNames?.forEach {
                try validate($0, name: "policyNames[]", parent: name, max: 1600)
                try validate($0, name: "policyNames[]", parent: name, min: 1)
                try validate($0, name: "policyNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.policyTypes?.forEach {
                try validate($0, name: "policyTypes[]", parent: name, max: 64)
                try validate($0, name: "policyTypes[]", parent: name, min: 1)
                try validate($0, name: "policyTypes[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
            case policyNames = "PolicyNames"
            case policyTypes = "PolicyTypes"
        }
    }

    public struct DescribeScalingActivitiesType: AWSEncodableShape {
        /// The activity IDs of the desired scaling activities. If you omit this property, all activities for the past six weeks are described. If unknown activities are requested, they are ignored with no error. If you specify an Auto Scaling group, the results are limited to that group. Array Members: Maximum number of 50 IDs.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var activityIds: [String]?
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// Indicates whether to include scaling activity from deleted Auto Scaling groups.
        public let includeDeletedGroups: Bool?
        /// The maximum number of items to return with this call. The default value is 100 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(activityIds: [String]? = nil, autoScalingGroupName: String? = nil, includeDeletedGroups: Bool? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.activityIds = activityIds
            self.autoScalingGroupName = autoScalingGroupName
            self.includeDeletedGroups = includeDeletedGroups
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.activityIds?.forEach {
                try validate($0, name: "activityIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case activityIds = "ActivityIds"
            case autoScalingGroupName = "AutoScalingGroupName"
            case includeDeletedGroups = "IncludeDeletedGroups"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeScheduledActionsType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The latest scheduled start time to return. If scheduled action names are provided, this property is ignored.
        public let endTime: Date?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The names of one or more scheduled actions. If you omit this property, all scheduled actions are described. If you specify an unknown scheduled action, it is ignored with no error. Array Members: Maximum number of 50 actions.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var scheduledActionNames: [String]?
        /// The earliest scheduled start time to return. If scheduled action names are provided, this property is ignored.
        public let startTime: Date?

        @inlinable
        public init(autoScalingGroupName: String? = nil, endTime: Date? = nil, maxRecords: Int? = nil, nextToken: String? = nil, scheduledActionNames: [String]? = nil, startTime: Date? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.endTime = endTime
            self.maxRecords = maxRecords
            self.nextToken = nextToken
            self.scheduledActionNames = scheduledActionNames
            self.startTime = startTime
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.scheduledActionNames?.forEach {
                try validate($0, name: "scheduledActionNames[]", parent: name, max: 255)
                try validate($0, name: "scheduledActionNames[]", parent: name, min: 1)
                try validate($0, name: "scheduledActionNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case endTime = "EndTime"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
            case scheduledActionNames = "ScheduledActionNames"
            case startTime = "StartTime"
        }
    }

    public struct DescribeTagsType: AWSEncodableShape {
        /// One or more filters to scope the tags to return. The maximum number of filters per filter type (for example, auto-scaling-group) is 1000.
        @OptionalCustomCoding<StandardArrayCoder<Filter>>
        public var filters: [Filter]?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(filters: [Filter]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.filters?.forEach {
                try $0.validate(name: "\(name).filters[]")
            }
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeTerminationPolicyTypesAnswer: AWSDecodableShape {
        /// The termination policies supported by Amazon EC2 Auto Scaling: OldestInstance, OldestLaunchConfiguration, NewestInstance, ClosestToNextInstanceHour, Default, OldestLaunchTemplate, and AllocationStrategy.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var terminationPolicyTypes: [String]?

        @inlinable
        public init(terminationPolicyTypes: [String]? = nil) {
            self.terminationPolicyTypes = terminationPolicyTypes
        }

        private enum CodingKeys: String, CodingKey {
            case terminationPolicyTypes = "TerminationPolicyTypes"
        }
    }

    public struct DescribeTrafficSourcesRequest: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The maximum number of items to return with this call. The maximum value is 50.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?
        /// The traffic source type that you want to describe. The following lists the valid values:    elb if the traffic source is a Classic Load Balancer.    elbv2 if the traffic source is a Application Load Balancer, Gateway Load Balancer, or Network Load Balancer.    vpc-lattice if the traffic source is VPC Lattice.
        public let trafficSourceType: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil, trafficSourceType: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
            self.trafficSourceType = trafficSourceType
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.trafficSourceType, name: "trafficSourceType", parent: name, max: 255)
            try self.validate(self.trafficSourceType, name: "trafficSourceType", parent: name, min: 1)
            try self.validate(self.trafficSourceType, name: "trafficSourceType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
            case trafficSourceType = "TrafficSourceType"
        }
    }

    public struct DescribeTrafficSourcesResponse: AWSDecodableShape {
        /// This string indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?
        /// Information about the traffic sources.
        @OptionalCustomCoding<StandardArrayCoder<TrafficSourceState>>
        public var trafficSources: [TrafficSourceState]?

        @inlinable
        public init(nextToken: String? = nil, trafficSources: [TrafficSourceState]? = nil) {
            self.nextToken = nextToken
            self.trafficSources = trafficSources
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case trafficSources = "TrafficSources"
        }
    }

    public struct DescribeWarmPoolAnswer: AWSDecodableShape {
        /// The instances that are currently in the warm pool.
        @OptionalCustomCoding<StandardArrayCoder<Instance>>
        public var instances: [Instance]?
        /// This string indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?
        /// The warm pool configuration details.
        public let warmPoolConfiguration: WarmPoolConfiguration?

        @inlinable
        public init(instances: [Instance]? = nil, nextToken: String? = nil, warmPoolConfiguration: WarmPoolConfiguration? = nil) {
            self.instances = instances
            self.nextToken = nextToken
            self.warmPoolConfiguration = warmPoolConfiguration
        }

        private enum CodingKeys: String, CodingKey {
            case instances = "Instances"
            case nextToken = "NextToken"
            case warmPoolConfiguration = "WarmPoolConfiguration"
        }
    }

    public struct DescribeWarmPoolType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The maximum number of instances to return with this call. The maximum value is 50.
        public let maxRecords: Int?
        /// The token for the next set of instances to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct DesiredConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// Describes the launch template and the version of the launch template that Amazon EC2 Auto Scaling uses to launch Amazon EC2 instances. For more information about launch templates, see Launch templates in the Amazon EC2 Auto Scaling User Guide.
        public let launchTemplate: LaunchTemplateSpecification?
        /// Use this structure to launch multiple instance types and On-Demand Instances and Spot Instances within a single Auto Scaling group. A mixed instances policy contains information that Amazon EC2 Auto Scaling can use to launch instances and help optimize your costs. For more information, see Auto Scaling groups with multiple instance types and purchase options in the Amazon EC2 Auto Scaling User Guide.
        public let mixedInstancesPolicy: MixedInstancesPolicy?

        @inlinable
        public init(launchTemplate: LaunchTemplateSpecification? = nil, mixedInstancesPolicy: MixedInstancesPolicy? = nil) {
            self.launchTemplate = launchTemplate
            self.mixedInstancesPolicy = mixedInstancesPolicy
        }

        public func validate(name: String) throws {
            try self.launchTemplate?.validate(name: "\(name).launchTemplate")
            try self.mixedInstancesPolicy?.validate(name: "\(name).mixedInstancesPolicy")
        }

        private enum CodingKeys: String, CodingKey {
            case launchTemplate = "LaunchTemplate"
            case mixedInstancesPolicy = "MixedInstancesPolicy"
        }
    }

    public struct DetachInstancesAnswer: AWSDecodableShape {
        /// The activities related to detaching the instances from the Auto Scaling group.
        @OptionalCustomCoding<StandardArrayCoder<Activity>>
        public var activities: [Activity]?

        @inlinable
        public init(activities: [Activity]? = nil) {
            self.activities = activities
        }

        private enum CodingKeys: String, CodingKey {
            case activities = "Activities"
        }
    }

    public struct DetachInstancesQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The IDs of the instances. You can specify up to 20 instances.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceIds: [String]?
        /// Indicates whether the Auto Scaling group decrements the desired capacity value by the number of instances detached.
        public let shouldDecrementDesiredCapacity: Bool?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceIds: [String]? = nil, shouldDecrementDesiredCapacity: Bool? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceIds = instanceIds
            self.shouldDecrementDesiredCapacity = shouldDecrementDesiredCapacity
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, max: 19)
                try validate($0, name: "instanceIds[]", parent: name, min: 1)
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceIds = "InstanceIds"
            case shouldDecrementDesiredCapacity = "ShouldDecrementDesiredCapacity"
        }
    }

    public struct DetachLoadBalancerTargetGroupsResultType: AWSDecodableShape {
        public init() {}
    }

    public struct DetachLoadBalancerTargetGroupsType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The Amazon Resource Names (ARN) of the target groups. You can specify up to 10 target groups.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var targetGroupARNs: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, targetGroupARNs: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.targetGroupARNs = targetGroupARNs
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.targetGroupARNs?.forEach {
                try validate($0, name: "targetGroupARNs[]", parent: name, max: 511)
                try validate($0, name: "targetGroupARNs[]", parent: name, min: 1)
                try validate($0, name: "targetGroupARNs[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case targetGroupARNs = "TargetGroupARNs"
        }
    }

    public struct DetachLoadBalancersResultType: AWSDecodableShape {
        public init() {}
    }

    public struct DetachLoadBalancersType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The names of the load balancers. You can specify up to 10 load balancers.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var loadBalancerNames: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, loadBalancerNames: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.loadBalancerNames = loadBalancerNames
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.loadBalancerNames?.forEach {
                try validate($0, name: "loadBalancerNames[]", parent: name, max: 255)
                try validate($0, name: "loadBalancerNames[]", parent: name, min: 1)
                try validate($0, name: "loadBalancerNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case loadBalancerNames = "LoadBalancerNames"
        }
    }

    public struct DetachTrafficSourcesResultType: AWSDecodableShape {
        public init() {}
    }

    public struct DetachTrafficSourcesType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The unique identifiers of one or more traffic sources. You can specify up to 10 traffic sources.
        @OptionalCustomCoding<StandardArrayCoder<TrafficSourceIdentifier>>
        public var trafficSources: [TrafficSourceIdentifier]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, trafficSources: [TrafficSourceIdentifier]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.trafficSources = trafficSources
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.trafficSources?.forEach {
                try $0.validate(name: "\(name).trafficSources[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case trafficSources = "TrafficSources"
        }
    }

    public struct DisableMetricsCollectionQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// Identifies the metrics to disable. You can specify one or more of the following metrics:    GroupMinSize     GroupMaxSize     GroupDesiredCapacity     GroupInServiceInstances     GroupPendingInstances     GroupStandbyInstances     GroupTerminatingInstances     GroupTotalInstances     GroupInServiceCapacity     GroupPendingCapacity     GroupStandbyCapacity     GroupTerminatingCapacity     GroupTotalCapacity     WarmPoolDesiredCapacity     WarmPoolWarmedCapacity     WarmPoolPendingCapacity     WarmPoolTerminatingCapacity     WarmPoolTotalCapacity     GroupAndWarmPoolDesiredCapacity     GroupAndWarmPoolTotalCapacity    If you omit this property, all metrics are disabled. For more information, see Amazon CloudWatch metrics for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var metrics: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, metrics: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.metrics = metrics
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.metrics?.forEach {
                try validate($0, name: "metrics[]", parent: name, max: 255)
                try validate($0, name: "metrics[]", parent: name, min: 1)
                try validate($0, name: "metrics[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case metrics = "Metrics"
        }
    }

    public struct Ebs: AWSEncodableShape & AWSDecodableShape {
        /// Indicates whether the volume is deleted on instance termination. For Amazon EC2 Auto Scaling, the default value is true.
        public let deleteOnTermination: Bool?
        /// Specifies whether the volume should be encrypted. Encrypted EBS volumes can only be attached to instances that support Amazon EBS encryption. For more information, see Requirements for Amazon EBS encryption in the Amazon EBS User Guide. If your AMI uses encrypted volumes, you can also only launch it on supported instance types.  If you are creating a volume from a snapshot, you cannot create an unencrypted volume from an encrypted snapshot. Also, you cannot specify a KMS key ID when using a launch configuration. If you enable encryption by default, the EBS volumes that you create are always encrypted, either using the Amazon Web Services managed KMS key or a customer-managed KMS key, regardless of whether the snapshot was encrypted.  For more information, see Use Amazon Web Services KMS keys to encrypt Amazon EBS volumes in the Amazon EC2 Auto Scaling User Guide.
        public let encrypted: Bool?
        /// The number of input/output (I/O) operations per second (IOPS) to provision for the volume. For gp3 and io1 volumes, this represents the number of IOPS that are provisioned for the volume. For gp2 volumes, this represents the baseline performance of the volume and the rate at which the volume accumulates I/O credits for bursting.  The following are the supported values for each volume type:     gp3: 3,000-16,000 IOPS    io1: 100-64,000 IOPS   For io1 volumes, we guarantee 64,000 IOPS only for Instances built on the Amazon Web Services Nitro System. Other instance families guarantee performance up to 32,000 IOPS.   Iops is supported when the volume type is gp3 or io1 and required only when the volume type is io1. (Not used with standard, gp2, st1, or sc1 volumes.)
        public let iops: Int?
        /// The snapshot ID of the volume to use. You must specify either a VolumeSize or a SnapshotId.
        public let snapshotId: String?
        /// The throughput (MiBps) to provision for a gp3 volume.
        public let throughput: Int?
        /// The volume size, in GiBs. The following are the supported volumes sizes for each volume type:     gp2 and gp3: 1-16,384    io1: 4-16,384    st1 and sc1: 125-16,384    standard: 1-1,024   You must specify either a SnapshotId or a VolumeSize. If you specify both SnapshotId and VolumeSize, the volume size must be equal or greater than the size of the snapshot.
        public let volumeSize: Int?
        /// The volume type. For more information, see Amazon EBS volume types in the Amazon EBS User Guide. Valid values: standard | io1 | gp2 | st1 | sc1 | gp3
        public let volumeType: String?

        @inlinable
        public init(deleteOnTermination: Bool? = nil, encrypted: Bool? = nil, iops: Int? = nil, snapshotId: String? = nil, throughput: Int? = nil, volumeSize: Int? = nil, volumeType: String? = nil) {
            self.deleteOnTermination = deleteOnTermination
            self.encrypted = encrypted
            self.iops = iops
            self.snapshotId = snapshotId
            self.throughput = throughput
            self.volumeSize = volumeSize
            self.volumeType = volumeType
        }

        public func validate(name: String) throws {
            try self.validate(self.iops, name: "iops", parent: name, max: 20000)
            try self.validate(self.iops, name: "iops", parent: name, min: 100)
            try self.validate(self.snapshotId, name: "snapshotId", parent: name, max: 255)
            try self.validate(self.snapshotId, name: "snapshotId", parent: name, min: 1)
            try self.validate(self.snapshotId, name: "snapshotId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.throughput, name: "throughput", parent: name, max: 1000)
            try self.validate(self.throughput, name: "throughput", parent: name, min: 125)
            try self.validate(self.volumeSize, name: "volumeSize", parent: name, max: 16384)
            try self.validate(self.volumeSize, name: "volumeSize", parent: name, min: 1)
            try self.validate(self.volumeType, name: "volumeType", parent: name, max: 255)
            try self.validate(self.volumeType, name: "volumeType", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case deleteOnTermination = "DeleteOnTermination"
            case encrypted = "Encrypted"
            case iops = "Iops"
            case snapshotId = "SnapshotId"
            case throughput = "Throughput"
            case volumeSize = "VolumeSize"
            case volumeType = "VolumeType"
        }
    }

    public struct EnableMetricsCollectionQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The frequency at which Amazon EC2 Auto Scaling sends aggregated data to CloudWatch. The only valid value is 1Minute.
        public let granularity: String?
        /// Identifies the metrics to enable. You can specify one or more of the following metrics:    GroupMinSize     GroupMaxSize     GroupDesiredCapacity     GroupInServiceInstances     GroupPendingInstances     GroupStandbyInstances     GroupTerminatingInstances     GroupTotalInstances     GroupInServiceCapacity     GroupPendingCapacity     GroupStandbyCapacity     GroupTerminatingCapacity     GroupTotalCapacity     WarmPoolDesiredCapacity     WarmPoolWarmedCapacity     WarmPoolPendingCapacity     WarmPoolTerminatingCapacity     WarmPoolTotalCapacity     GroupAndWarmPoolDesiredCapacity     GroupAndWarmPoolTotalCapacity    If you specify Granularity and don't specify any metrics, all metrics are enabled. For more information, see Amazon CloudWatch metrics for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var metrics: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, granularity: String? = nil, metrics: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.granularity = granularity
            self.metrics = metrics
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.granularity, name: "granularity", parent: name, max: 255)
            try self.validate(self.granularity, name: "granularity", parent: name, min: 1)
            try self.validate(self.granularity, name: "granularity", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.metrics?.forEach {
                try validate($0, name: "metrics[]", parent: name, max: 255)
                try validate($0, name: "metrics[]", parent: name, min: 1)
                try validate($0, name: "metrics[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case granularity = "Granularity"
            case metrics = "Metrics"
        }
    }

    public struct EnabledMetric: AWSDecodableShape {
        /// The granularity of the metric. The only valid value is 1Minute.
        public let granularity: String?
        /// One of the following metrics:    GroupMinSize     GroupMaxSize     GroupDesiredCapacity     GroupInServiceInstances     GroupPendingInstances     GroupStandbyInstances     GroupTerminatingInstances     GroupTotalInstances     GroupInServiceCapacity     GroupPendingCapacity     GroupStandbyCapacity     GroupTerminatingCapacity     GroupTotalCapacity     WarmPoolDesiredCapacity     WarmPoolWarmedCapacity     WarmPoolPendingCapacity     WarmPoolTerminatingCapacity     WarmPoolTotalCapacity     GroupAndWarmPoolDesiredCapacity     GroupAndWarmPoolTotalCapacity    For more information, see Amazon CloudWatch metrics for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide.
        public let metric: String?

        @inlinable
        public init(granularity: String? = nil, metric: String? = nil) {
            self.granularity = granularity
            self.metric = metric
        }

        private enum CodingKeys: String, CodingKey {
            case granularity = "Granularity"
            case metric = "Metric"
        }
    }

    public struct EnterStandbyAnswer: AWSDecodableShape {
        /// The activities related to moving instances into Standby mode.
        @OptionalCustomCoding<StandardArrayCoder<Activity>>
        public var activities: [Activity]?

        @inlinable
        public init(activities: [Activity]? = nil) {
            self.activities = activities
        }

        private enum CodingKeys: String, CodingKey {
            case activities = "Activities"
        }
    }

    public struct EnterStandbyQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The IDs of the instances. You can specify up to 20 instances.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceIds: [String]?
        /// Indicates whether to decrement the desired capacity of the Auto Scaling group by the number of instances moved to Standby mode.
        public let shouldDecrementDesiredCapacity: Bool?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceIds: [String]? = nil, shouldDecrementDesiredCapacity: Bool? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceIds = instanceIds
            self.shouldDecrementDesiredCapacity = shouldDecrementDesiredCapacity
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, max: 19)
                try validate($0, name: "instanceIds[]", parent: name, min: 1)
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceIds = "InstanceIds"
            case shouldDecrementDesiredCapacity = "ShouldDecrementDesiredCapacity"
        }
    }

    public struct ExecutePolicyType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The breach threshold for the alarm. Required if the policy type is StepScaling and not supported otherwise.
        public let breachThreshold: Double?
        /// Indicates whether Amazon EC2 Auto Scaling waits for the cooldown period to complete before executing the policy. Valid only if the policy type is SimpleScaling. For more information, see Scaling cooldowns for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide.
        public let honorCooldown: Bool?
        /// The metric value to compare to BreachThreshold. This enables you to execute a policy of type StepScaling and determine which step adjustment to use. For example, if the breach threshold is 50 and you want to use a step adjustment with a lower bound of 0 and an upper bound of 10, you can set the metric value to 59. If you specify a metric value that doesn't correspond to a step adjustment for the policy, the call returns an error. Required if the policy type is StepScaling and not supported otherwise.
        public let metricValue: Double?
        /// The name or ARN of the policy.
        public let policyName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, breachThreshold: Double? = nil, honorCooldown: Bool? = nil, metricValue: Double? = nil, policyName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.breachThreshold = breachThreshold
            self.honorCooldown = honorCooldown
            self.metricValue = metricValue
            self.policyName = policyName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.policyName, name: "policyName", parent: name, max: 1600)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case breachThreshold = "BreachThreshold"
            case honorCooldown = "HonorCooldown"
            case metricValue = "MetricValue"
            case policyName = "PolicyName"
        }
    }

    public struct ExitStandbyAnswer: AWSDecodableShape {
        /// The activities related to moving instances out of Standby mode.
        @OptionalCustomCoding<StandardArrayCoder<Activity>>
        public var activities: [Activity]?

        @inlinable
        public init(activities: [Activity]? = nil) {
            self.activities = activities
        }

        private enum CodingKeys: String, CodingKey {
            case activities = "Activities"
        }
    }

    public struct ExitStandbyQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The IDs of the instances. You can specify up to 20 instances.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceIds: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceIds: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceIds = instanceIds
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, max: 19)
                try validate($0, name: "instanceIds[]", parent: name, min: 1)
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceIds = "InstanceIds"
        }
    }

    public struct FailedScheduledUpdateGroupActionRequest: AWSDecodableShape {
        /// The error code.
        public let errorCode: String?
        /// The error message accompanying the error code.
        public let errorMessage: String?
        /// The name of the scheduled action.
        public let scheduledActionName: String?

        @inlinable
        public init(errorCode: String? = nil, errorMessage: String? = nil, scheduledActionName: String? = nil) {
            self.errorCode = errorCode
            self.errorMessage = errorMessage
            self.scheduledActionName = scheduledActionName
        }

        private enum CodingKeys: String, CodingKey {
            case errorCode = "ErrorCode"
            case errorMessage = "ErrorMessage"
            case scheduledActionName = "ScheduledActionName"
        }
    }

    public struct Filter: AWSEncodableShape {
        /// The name of the filter. The valid values for Name depend on which API operation you're using with the filter (DescribeAutoScalingGroups or  DescribeTags).  DescribeAutoScalingGroups  Valid values for Name include the following:     tag-key - Accepts tag keys. The results only include information about the Auto Scaling groups associated with these tag keys.     tag-value - Accepts tag values. The results only include information about the Auto Scaling groups associated with these tag values.     tag: - Accepts the key/value combination of the tag. Use the tag key in the filter name and the tag value as the filter value. The results only include information about the Auto Scaling groups associated with the specified key/value combination.     DescribeTags  Valid values for Name include the following:     auto-scaling-group - Accepts the names of Auto Scaling groups. The results only include information about the tags associated with these Auto Scaling groups.     key - Accepts tag keys. The results only include information about the tags associated with these tag keys.     value - Accepts tag values. The results only include information about the tags associated with these tag values.     propagate-at-launch - Accepts a Boolean value, which specifies whether tags propagate to instances at launch. The results only include information about the tags associated with the specified Boolean value.
        public let name: String?
        /// One or more filter values. Filter values are case-sensitive.  If you specify multiple values for a filter, the values are automatically logically joined with an OR, and the request returns all results that match any of the specified values. For example, specify "tag:environment" for the filter name and "production,development" for the filter values to find Auto Scaling groups with the tag "environment=production" or "environment=development".
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(name: String? = nil, values: [String]? = nil) {
            self.name = name
            self.values = values
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.values?.forEach {
                try validate($0, name: "values[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case values = "Values"
        }
    }

    public struct GetPredictiveScalingForecastAnswer: AWSDecodableShape {
        /// The capacity forecast.
        public let capacityForecast: CapacityForecast?
        /// The load forecast.
        @OptionalCustomCoding<StandardArrayCoder<LoadForecast>>
        public var loadForecast: [LoadForecast]?
        /// The time the forecast was made.
        public let updateTime: Date?

        @inlinable
        public init(capacityForecast: CapacityForecast? = nil, loadForecast: [LoadForecast]? = nil, updateTime: Date? = nil) {
            self.capacityForecast = capacityForecast
            self.loadForecast = loadForecast
            self.updateTime = updateTime
        }

        private enum CodingKeys: String, CodingKey {
            case capacityForecast = "CapacityForecast"
            case loadForecast = "LoadForecast"
            case updateTime = "UpdateTime"
        }
    }

    public struct GetPredictiveScalingForecastType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The exclusive end time of the time range for the forecast data to get. The maximum time duration between the start and end time is 30 days.  Although this parameter can accept a date and time that is more than two days in the future, the availability of forecast data has limits. Amazon EC2 Auto Scaling only issues forecasts for periods of two days in advance.
        public let endTime: Date?
        /// The name of the policy.
        public let policyName: String?
        /// The inclusive start time of the time range for the forecast data to get. At most, the date and time can be one year before the current date and time.
        public let startTime: Date?

        @inlinable
        public init(autoScalingGroupName: String? = nil, endTime: Date? = nil, policyName: String? = nil, startTime: Date? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.endTime = endTime
            self.policyName = policyName
            self.startTime = startTime
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.policyName, name: "policyName", parent: name, max: 255)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case endTime = "EndTime"
            case policyName = "PolicyName"
            case startTime = "StartTime"
        }
    }

    public struct Instance: AWSDecodableShape {
        /// The Availability Zone in which the instance is running.
        public let availabilityZone: String?
        /// The last reported health status of the instance. Healthy means that the instance is healthy and should remain in service. Unhealthy means that the instance is unhealthy and that Amazon EC2 Auto Scaling should terminate and replace it.
        public let healthStatus: String?
        /// The ID of the instance.
        public let instanceId: String?
        /// The instance type of the EC2 instance.
        public let instanceType: String?
        /// The launch configuration associated with the instance.
        public let launchConfigurationName: String?
        /// The launch template for the instance.
        public let launchTemplate: LaunchTemplateSpecification?
        /// A description of the current lifecycle state. The Quarantined state is not used. For more information, see Amazon EC2 Auto Scaling instance lifecycle in the Amazon EC2 Auto Scaling User Guide.
        public let lifecycleState: LifecycleState?
        /// Indicates whether the instance is protected from termination by Amazon EC2 Auto Scaling when scaling in.
        public let protectedFromScaleIn: Bool?
        /// The number of capacity units contributed by the instance based on its instance type. Valid Range: Minimum value of 1. Maximum value of 999.
        public let weightedCapacity: String?

        @inlinable
        public init(availabilityZone: String? = nil, healthStatus: String? = nil, instanceId: String? = nil, instanceType: String? = nil, launchConfigurationName: String? = nil, launchTemplate: LaunchTemplateSpecification? = nil, lifecycleState: LifecycleState? = nil, protectedFromScaleIn: Bool? = nil, weightedCapacity: String? = nil) {
            self.availabilityZone = availabilityZone
            self.healthStatus = healthStatus
            self.instanceId = instanceId
            self.instanceType = instanceType
            self.launchConfigurationName = launchConfigurationName
            self.launchTemplate = launchTemplate
            self.lifecycleState = lifecycleState
            self.protectedFromScaleIn = protectedFromScaleIn
            self.weightedCapacity = weightedCapacity
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case healthStatus = "HealthStatus"
            case instanceId = "InstanceId"
            case instanceType = "InstanceType"
            case launchConfigurationName = "LaunchConfigurationName"
            case launchTemplate = "LaunchTemplate"
            case lifecycleState = "LifecycleState"
            case protectedFromScaleIn = "ProtectedFromScaleIn"
            case weightedCapacity = "WeightedCapacity"
        }
    }

    public struct InstanceMaintenancePolicy: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the upper threshold as a percentage of the desired capacity of the Auto Scaling group. It represents the maximum percentage of the group that can be in service and healthy, or pending, to support your workload when replacing instances. Value range is 100 to 200. To clear a previously set value, specify a value of -1. Both MinHealthyPercentage and MaxHealthyPercentage must be specified, and the difference between them cannot be greater than 100. A large range increases the number of instances that can be replaced at the same time.
        public let maxHealthyPercentage: Int?
        /// Specifies the lower threshold as a percentage of the desired capacity of the Auto Scaling group. It represents the minimum percentage of the group to keep in service, healthy, and ready to use to support your workload when replacing instances. Value range is 0 to 100. To clear a previously set value, specify a value of -1.
        public let minHealthyPercentage: Int?

        @inlinable
        public init(maxHealthyPercentage: Int? = nil, minHealthyPercentage: Int? = nil) {
            self.maxHealthyPercentage = maxHealthyPercentage
            self.minHealthyPercentage = minHealthyPercentage
        }

        public func validate(name: String) throws {
            try self.validate(self.maxHealthyPercentage, name: "maxHealthyPercentage", parent: name, max: 200)
            try self.validate(self.maxHealthyPercentage, name: "maxHealthyPercentage", parent: name, min: -1)
            try self.validate(self.minHealthyPercentage, name: "minHealthyPercentage", parent: name, max: 100)
            try self.validate(self.minHealthyPercentage, name: "minHealthyPercentage", parent: name, min: -1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxHealthyPercentage = "MaxHealthyPercentage"
            case minHealthyPercentage = "MinHealthyPercentage"
        }
    }

    public struct InstanceMetadataOptions: AWSEncodableShape & AWSDecodableShape {
        /// This parameter enables or disables the HTTP metadata endpoint on your instances. If the parameter is not specified, the default state is enabled.  If you specify a value of disabled, you will not be able to access your instance metadata.
        public let httpEndpoint: InstanceMetadataEndpointState?
        /// The desired HTTP PUT response hop limit for instance metadata requests. The larger the number, the further instance metadata requests can travel. Default: 1
        public let httpPutResponseHopLimit: Int?
        /// The state of token usage for your instance metadata requests. If the parameter is not specified in the request, the default state is optional. If the state is optional, you can choose to retrieve instance metadata with or without a signed token header on your request. If you retrieve the IAM role credentials without a token, the version 1.0 role credentials are returned. If you retrieve the IAM role credentials using a valid signed token, the version 2.0 role credentials are returned. If the state is required, you must send a signed token header with any instance metadata retrieval requests. In this state, retrieving the IAM role credentials always returns the version 2.0 credentials; the version 1.0 credentials are not available.
        public let httpTokens: InstanceMetadataHttpTokensState?

        @inlinable
        public init(httpEndpoint: InstanceMetadataEndpointState? = nil, httpPutResponseHopLimit: Int? = nil, httpTokens: InstanceMetadataHttpTokensState? = nil) {
            self.httpEndpoint = httpEndpoint
            self.httpPutResponseHopLimit = httpPutResponseHopLimit
            self.httpTokens = httpTokens
        }

        public func validate(name: String) throws {
            try self.validate(self.httpPutResponseHopLimit, name: "httpPutResponseHopLimit", parent: name, max: 64)
            try self.validate(self.httpPutResponseHopLimit, name: "httpPutResponseHopLimit", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case httpEndpoint = "HttpEndpoint"
            case httpPutResponseHopLimit = "HttpPutResponseHopLimit"
            case httpTokens = "HttpTokens"
        }
    }

    public struct InstanceMonitoring: AWSEncodableShape & AWSDecodableShape {
        /// If true, detailed monitoring is enabled. Otherwise, basic monitoring is enabled.
        public let enabled: Bool?

        @inlinable
        public init(enabled: Bool? = nil) {
            self.enabled = enabled
        }

        private enum CodingKeys: String, CodingKey {
            case enabled = "Enabled"
        }
    }

    public struct InstanceRefresh: AWSDecodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// Describes the desired configuration for the instance refresh.
        public let desiredConfiguration: DesiredConfiguration?
        /// The date and time at which the instance refresh ended.
        public let endTime: Date?
        /// The instance refresh ID.
        public let instanceRefreshId: String?
        /// The number of instances remaining to update before the instance refresh is complete.  If you roll back the instance refresh, InstancesToUpdate shows you the number of instances that were not yet updated by the instance refresh. Therefore, these instances don't need to be replaced as part of the rollback.
        public let instancesToUpdate: Int?
        /// The percentage of the instance refresh that is complete. For each instance replacement, Amazon EC2 Auto Scaling tracks the instance's health status and warm-up time. When the instance's health status changes to healthy and the specified warm-up time passes, the instance is considered updated and is added to the percentage complete.   PercentageComplete does not include instances that are replaced during a rollback. This value gradually goes back down to zero during a rollback.
        public let percentageComplete: Int?
        /// The preferences for an instance refresh.
        public let preferences: RefreshPreferences?
        /// Additional progress details for an Auto Scaling group that has a warm pool.
        public let progressDetails: InstanceRefreshProgressDetails?
        /// The rollback details.
        public let rollbackDetails: RollbackDetails?
        /// The date and time at which the instance refresh began.
        public let startTime: Date?
        /// The current status for the instance refresh operation:    Pending - The request was created, but the instance refresh has not started.    InProgress - An instance refresh is in progress.    Successful - An instance refresh completed successfully.    Failed - An instance refresh failed to complete. You can troubleshoot using the status reason and the scaling activities.     Cancelling - An ongoing instance refresh is being cancelled.    Cancelled - The instance refresh is cancelled.     RollbackInProgress - An instance refresh is being rolled back.    RollbackFailed - The rollback failed to complete. You can troubleshoot using the status reason and the scaling activities.    RollbackSuccessful - The rollback completed successfully.    Baking - Waiting the specified bake time after an instance refresh has finished updating instances.
        public let status: InstanceRefreshStatus?
        /// The explanation for the specific status assigned to this operation.
        public let statusReason: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, desiredConfiguration: DesiredConfiguration? = nil, endTime: Date? = nil, instanceRefreshId: String? = nil, instancesToUpdate: Int? = nil, percentageComplete: Int? = nil, preferences: RefreshPreferences? = nil, progressDetails: InstanceRefreshProgressDetails? = nil, rollbackDetails: RollbackDetails? = nil, startTime: Date? = nil, status: InstanceRefreshStatus? = nil, statusReason: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.desiredConfiguration = desiredConfiguration
            self.endTime = endTime
            self.instanceRefreshId = instanceRefreshId
            self.instancesToUpdate = instancesToUpdate
            self.percentageComplete = percentageComplete
            self.preferences = preferences
            self.progressDetails = progressDetails
            self.rollbackDetails = rollbackDetails
            self.startTime = startTime
            self.status = status
            self.statusReason = statusReason
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case desiredConfiguration = "DesiredConfiguration"
            case endTime = "EndTime"
            case instanceRefreshId = "InstanceRefreshId"
            case instancesToUpdate = "InstancesToUpdate"
            case percentageComplete = "PercentageComplete"
            case preferences = "Preferences"
            case progressDetails = "ProgressDetails"
            case rollbackDetails = "RollbackDetails"
            case startTime = "StartTime"
            case status = "Status"
            case statusReason = "StatusReason"
        }
    }

    public struct InstanceRefreshLivePoolProgress: AWSDecodableShape {
        /// The number of instances remaining to update.
        public let instancesToUpdate: Int?
        /// The percentage of instances in the Auto Scaling group that have been replaced. For each instance replacement, Amazon EC2 Auto Scaling tracks the instance's health status and warm-up time. When the instance's health status changes to healthy and the specified warm-up time passes, the instance is considered updated and is added to the percentage complete.
        public let percentageComplete: Int?

        @inlinable
        public init(instancesToUpdate: Int? = nil, percentageComplete: Int? = nil) {
            self.instancesToUpdate = instancesToUpdate
            self.percentageComplete = percentageComplete
        }

        private enum CodingKeys: String, CodingKey {
            case instancesToUpdate = "InstancesToUpdate"
            case percentageComplete = "PercentageComplete"
        }
    }

    public struct InstanceRefreshProgressDetails: AWSDecodableShape {
        /// Reports progress on replacing instances that are in the Auto Scaling group.
        public let livePoolProgress: InstanceRefreshLivePoolProgress?
        /// Reports progress on replacing instances that are in the warm pool.
        public let warmPoolProgress: InstanceRefreshWarmPoolProgress?

        @inlinable
        public init(livePoolProgress: InstanceRefreshLivePoolProgress? = nil, warmPoolProgress: InstanceRefreshWarmPoolProgress? = nil) {
            self.livePoolProgress = livePoolProgress
            self.warmPoolProgress = warmPoolProgress
        }

        private enum CodingKeys: String, CodingKey {
            case livePoolProgress = "LivePoolProgress"
            case warmPoolProgress = "WarmPoolProgress"
        }
    }

    public struct InstanceRefreshWarmPoolProgress: AWSDecodableShape {
        /// The number of instances remaining to update.
        public let instancesToUpdate: Int?
        /// The percentage of instances in the warm pool that have been replaced. For each instance replacement, Amazon EC2 Auto Scaling tracks the instance's health status and warm-up time. When the instance's health status changes to healthy and the specified warm-up time passes, the instance is considered updated and is added to the percentage complete.
        public let percentageComplete: Int?

        @inlinable
        public init(instancesToUpdate: Int? = nil, percentageComplete: Int? = nil) {
            self.instancesToUpdate = instancesToUpdate
            self.percentageComplete = percentageComplete
        }

        private enum CodingKeys: String, CodingKey {
            case instancesToUpdate = "InstancesToUpdate"
            case percentageComplete = "PercentageComplete"
        }
    }

    public struct InstanceRequirements: AWSEncodableShape & AWSDecodableShape {
        /// The minimum and maximum number of accelerators (GPUs, FPGAs, or Amazon Web Services Inferentia chips) for an instance type. To exclude accelerator-enabled instance types, set Max to 0. Default: No minimum or maximum limits
        public let acceleratorCount: AcceleratorCountRequest?
        /// Indicates whether instance types must have accelerators by specific manufacturers.   For instance types with NVIDIA devices, specify nvidia.   For instance types with AMD devices, specify amd.   For instance types with Amazon Web Services devices, specify amazon-web-services.   For instance types with Xilinx devices, specify xilinx.   Default: Any manufacturer
        @OptionalCustomCoding<StandardArrayCoder<AcceleratorManufacturer>>
        public var acceleratorManufacturers: [AcceleratorManufacturer]?
        /// Lists the accelerators that must be on an instance type.   For instance types with NVIDIA A100 GPUs, specify a100.   For instance types with NVIDIA V100 GPUs, specify v100.   For instance types with NVIDIA K80 GPUs, specify k80.   For instance types with NVIDIA T4 GPUs, specify t4.   For instance types with NVIDIA M60 GPUs, specify m60.   For instance types with AMD Radeon Pro V520 GPUs, specify radeon-pro-v520.   For instance types with Xilinx VU9P FPGAs, specify vu9p.   Default: Any accelerator
        @OptionalCustomCoding<StandardArrayCoder<AcceleratorName>>
        public var acceleratorNames: [AcceleratorName]?
        /// The minimum and maximum total memory size for the accelerators on an instance type, in MiB. Default: No minimum or maximum limits
        public let acceleratorTotalMemoryMiB: AcceleratorTotalMemoryMiBRequest?
        /// Lists the accelerator types that must be on an instance type.   For instance types with GPU accelerators, specify gpu.   For instance types with FPGA accelerators, specify fpga.   For instance types with inference accelerators, specify inference.   Default: Any accelerator type
        @OptionalCustomCoding<StandardArrayCoder<AcceleratorType>>
        public var acceleratorTypes: [AcceleratorType]?
        /// The instance types to apply your specified attributes against. All other instance types are ignored, even if they match your specified attributes. You can use strings with one or more wild cards, represented by an asterisk (*), to allow an instance type, size, or generation. The following are examples: m5.8xlarge, c5*.*, m5a.*, r*, *3*. For example, if you specify c5*, Amazon EC2 Auto Scaling will allow the entire C5 instance family, which includes all C5a and C5n instance types. If you specify m5a.*, Amazon EC2 Auto Scaling will allow all the M5a instance types, but not the M5n instance types.  If you specify AllowedInstanceTypes, you can't specify ExcludedInstanceTypes.  Default: All instance types
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var allowedInstanceTypes: [String]?
        /// Indicates whether bare metal instance types are included, excluded, or required. Default: excluded
        public let bareMetal: BareMetal?
        /// The minimum and maximum baseline bandwidth performance for an instance type, in Mbps. For more information, see Amazon EBS–optimized instances in the Amazon EC2 User Guide. Default: No minimum or maximum limits
        public let baselineEbsBandwidthMbps: BaselineEbsBandwidthMbpsRequest?
        ///  The baseline performance factors for the instance requirements.
        public let baselinePerformanceFactors: BaselinePerformanceFactorsRequest?
        /// Indicates whether burstable performance instance types are included, excluded, or required. For more information, see Burstable performance instances in the Amazon EC2 User Guide. Default: excluded
        public let burstablePerformance: BurstablePerformance?
        /// Lists which specific CPU manufacturers to include.   For instance types with Intel CPUs, specify intel.   For instance types with AMD CPUs, specify amd.   For instance types with Amazon Web Services CPUs, specify amazon-web-services.   For instance types with Apple CPUs, specify apple.    Don't confuse the CPU hardware manufacturer with the CPU hardware architecture. Instances will be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you specify in your launch template.   Default: Any manufacturer
        @OptionalCustomCoding<StandardArrayCoder<CpuManufacturer>>
        public var cpuManufacturers: [CpuManufacturer]?
        /// The instance types to exclude. You can use strings with one or more wild cards, represented by an asterisk (*), to exclude an instance family, type, size, or generation. The following are examples: m5.8xlarge, c5*.*, m5a.*, r*, *3*.  For example, if you specify c5*, you are excluding the entire C5 instance family, which includes all C5a and C5n instance types. If you specify m5a.*, Amazon EC2 Auto Scaling will exclude all the M5a instance types, but not the M5n instance types.  If you specify ExcludedInstanceTypes, you can't specify AllowedInstanceTypes.  Default: No excluded instance types
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var excludedInstanceTypes: [String]?
        /// Indicates whether current or previous generation instance types are included.   For current generation instance types, specify current. The current generation includes EC2 instance types currently recommended for use. This typically includes the latest two to three generations in each instance family. For more information, see Instance types in the Amazon EC2 User Guide.   For previous generation instance types, specify previous.   Default: Any current or previous generation
        @OptionalCustomCoding<StandardArrayCoder<InstanceGeneration>>
        public var instanceGenerations: [InstanceGeneration]?
        /// Indicates whether instance types with instance store volumes are included, excluded, or required. For more information, see Amazon EC2 instance store in the Amazon EC2 User Guide. Default: included
        public let localStorage: LocalStorage?
        /// Indicates the type of local storage that is required.   For instance types with hard disk drive (HDD) storage, specify hdd.   For instance types with solid state drive (SSD) storage, specify ssd.   Default: Any local storage type
        @OptionalCustomCoding<StandardArrayCoder<LocalStorageType>>
        public var localStorageTypes: [LocalStorageType]?
        /// [Price protection] The price protection threshold for Spot Instances, as a percentage of an identified On-Demand price. The identified On-Demand price is the price of the lowest priced current generation C, M, or R instance type with your specified attributes. If no current generation C, M, or R instance type matches your attributes, then the identified price is from either the lowest priced current generation instance types or, failing that, the lowest priced previous generation instance types that match your attributes. When Amazon EC2 Auto Scaling selects instance types with your attributes, we will exclude instance types whose price exceeds your specified threshold. The parameter accepts an integer, which Amazon EC2 Auto Scaling interprets as a percentage. If you set DesiredCapacityType to vcpu or memory-mib, the price protection threshold is based on the per-vCPU or per-memory price instead of the per instance price.   Only one of SpotMaxPricePercentageOverLowestPrice or MaxSpotPriceAsPercentageOfOptimalOnDemandPrice can be specified. If you don't specify either, Amazon EC2 Auto Scaling will automatically apply optimal price protection to consistently select from a wide range of instance types. To indicate no price protection threshold for Spot Instances, meaning you want to consider all instance types that match your attributes, include one of these parameters and specify a high value, such as 999999.
        public let maxSpotPriceAsPercentageOfOptimalOnDemandPrice: Int?
        /// The minimum and maximum amount of memory per vCPU for an instance type, in GiB. Default: No minimum or maximum limits
        public let memoryGiBPerVCpu: MemoryGiBPerVCpuRequest?
        /// The minimum and maximum instance memory size for an instance type, in MiB.
        public let memoryMiB: MemoryMiBRequest?
        /// The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps). Default: No minimum or maximum limits
        public let networkBandwidthGbps: NetworkBandwidthGbpsRequest?
        /// The minimum and maximum number of network interfaces for an instance type. Default: No minimum or maximum limits
        public let networkInterfaceCount: NetworkInterfaceCountRequest?
        /// [Price protection] The price protection threshold for On-Demand Instances, as a percentage higher than an identified On-Demand price. The identified On-Demand price is the price of the lowest priced current generation C, M, or R instance type with your specified attributes. If no current generation C, M, or R instance type matches your attributes, then the identified price is from either the lowest priced current generation instance types or, failing that, the lowest priced previous generation instance types that match your attributes. When Amazon EC2 Auto Scaling selects instance types with your attributes, we will exclude instance types whose price exceeds your specified threshold.  The parameter accepts an integer, which Amazon EC2 Auto Scaling interprets as a percentage. To turn off price protection, specify a high value, such as 999999.  If you set DesiredCapacityType to vcpu or memory-mib, the price protection threshold is applied based on the per-vCPU or per-memory price instead of the per instance price.  Default: 20
        public let onDemandMaxPricePercentageOverLowestPrice: Int?
        /// Indicates whether instance types must provide On-Demand Instance hibernation support. Default: false
        public let requireHibernateSupport: Bool?
        /// [Price protection] The price protection threshold for Spot Instances, as a percentage higher than an identified Spot price. The identified Spot price is the price of the lowest priced current generation C, M, or R instance type with your specified attributes. If no current generation C, M, or R instance type matches your attributes, then the identified price is from either the lowest priced current generation instance types or, failing that, the lowest priced previous generation instance types that match your attributes. When Amazon EC2 Auto Scaling selects instance types with your attributes, we will exclude instance types whose price exceeds your specified threshold. The parameter accepts an integer, which Amazon EC2 Auto Scaling interprets as a percentage.  If you set DesiredCapacityType to vcpu or memory-mib, the price protection threshold is based on the per-vCPU or per-memory price instead of the per instance price.   Only one of SpotMaxPricePercentageOverLowestPrice or MaxSpotPriceAsPercentageOfOptimalOnDemandPrice can be specified. If you don't specify either, Amazon EC2 Auto Scaling will automatically apply optimal price protection to consistently select from a wide range of instance types. To indicate no price protection threshold for Spot Instances, meaning you want to consider all instance types that match your attributes, include one of these parameters and specify a high value, such as 999999.
        public let spotMaxPricePercentageOverLowestPrice: Int?
        /// The minimum and maximum total local storage size for an instance type, in GB. Default: No minimum or maximum limits
        public let totalLocalStorageGB: TotalLocalStorageGBRequest?
        /// The minimum and maximum number of vCPUs for an instance type.
        public let vCpuCount: VCpuCountRequest?

        @inlinable
        public init(acceleratorCount: AcceleratorCountRequest? = nil, acceleratorManufacturers: [AcceleratorManufacturer]? = nil, acceleratorNames: [AcceleratorName]? = nil, acceleratorTotalMemoryMiB: AcceleratorTotalMemoryMiBRequest? = nil, acceleratorTypes: [AcceleratorType]? = nil, allowedInstanceTypes: [String]? = nil, bareMetal: BareMetal? = nil, baselineEbsBandwidthMbps: BaselineEbsBandwidthMbpsRequest? = nil, baselinePerformanceFactors: BaselinePerformanceFactorsRequest? = nil, burstablePerformance: BurstablePerformance? = nil, cpuManufacturers: [CpuManufacturer]? = nil, excludedInstanceTypes: [String]? = nil, instanceGenerations: [InstanceGeneration]? = nil, localStorage: LocalStorage? = nil, localStorageTypes: [LocalStorageType]? = nil, maxSpotPriceAsPercentageOfOptimalOnDemandPrice: Int? = nil, memoryGiBPerVCpu: MemoryGiBPerVCpuRequest? = nil, memoryMiB: MemoryMiBRequest? = nil, networkBandwidthGbps: NetworkBandwidthGbpsRequest? = nil, networkInterfaceCount: NetworkInterfaceCountRequest? = nil, onDemandMaxPricePercentageOverLowestPrice: Int? = nil, requireHibernateSupport: Bool? = nil, spotMaxPricePercentageOverLowestPrice: Int? = nil, totalLocalStorageGB: TotalLocalStorageGBRequest? = nil, vCpuCount: VCpuCountRequest? = nil) {
            self.acceleratorCount = acceleratorCount
            self.acceleratorManufacturers = acceleratorManufacturers
            self.acceleratorNames = acceleratorNames
            self.acceleratorTotalMemoryMiB = acceleratorTotalMemoryMiB
            self.acceleratorTypes = acceleratorTypes
            self.allowedInstanceTypes = allowedInstanceTypes
            self.bareMetal = bareMetal
            self.baselineEbsBandwidthMbps = baselineEbsBandwidthMbps
            self.baselinePerformanceFactors = baselinePerformanceFactors
            self.burstablePerformance = burstablePerformance
            self.cpuManufacturers = cpuManufacturers
            self.excludedInstanceTypes = excludedInstanceTypes
            self.instanceGenerations = instanceGenerations
            self.localStorage = localStorage
            self.localStorageTypes = localStorageTypes
            self.maxSpotPriceAsPercentageOfOptimalOnDemandPrice = maxSpotPriceAsPercentageOfOptimalOnDemandPrice
            self.memoryGiBPerVCpu = memoryGiBPerVCpu
            self.memoryMiB = memoryMiB
            self.networkBandwidthGbps = networkBandwidthGbps
            self.networkInterfaceCount = networkInterfaceCount
            self.onDemandMaxPricePercentageOverLowestPrice = onDemandMaxPricePercentageOverLowestPrice
            self.requireHibernateSupport = requireHibernateSupport
            self.spotMaxPricePercentageOverLowestPrice = spotMaxPricePercentageOverLowestPrice
            self.totalLocalStorageGB = totalLocalStorageGB
            self.vCpuCount = vCpuCount
        }

        public func validate(name: String) throws {
            try self.acceleratorCount?.validate(name: "\(name).acceleratorCount")
            try self.acceleratorTotalMemoryMiB?.validate(name: "\(name).acceleratorTotalMemoryMiB")
            try self.allowedInstanceTypes?.forEach {
                try validate($0, name: "allowedInstanceTypes[]", parent: name, max: 30)
                try validate($0, name: "allowedInstanceTypes[]", parent: name, min: 1)
                try validate($0, name: "allowedInstanceTypes[]", parent: name, pattern: "^[a-zA-Z0-9\\.\\*\\-]+$")
            }
            try self.validate(self.allowedInstanceTypes, name: "allowedInstanceTypes", parent: name, max: 400)
            try self.baselineEbsBandwidthMbps?.validate(name: "\(name).baselineEbsBandwidthMbps")
            try self.excludedInstanceTypes?.forEach {
                try validate($0, name: "excludedInstanceTypes[]", parent: name, max: 30)
                try validate($0, name: "excludedInstanceTypes[]", parent: name, min: 1)
                try validate($0, name: "excludedInstanceTypes[]", parent: name, pattern: "^[a-zA-Z0-9\\.\\*\\-]+$")
            }
            try self.validate(self.excludedInstanceTypes, name: "excludedInstanceTypes", parent: name, max: 400)
            try self.validate(self.maxSpotPriceAsPercentageOfOptimalOnDemandPrice, name: "maxSpotPriceAsPercentageOfOptimalOnDemandPrice", parent: name, min: 0)
            try self.memoryGiBPerVCpu?.validate(name: "\(name).memoryGiBPerVCpu")
            try self.memoryMiB?.validate(name: "\(name).memoryMiB")
            try self.networkBandwidthGbps?.validate(name: "\(name).networkBandwidthGbps")
            try self.networkInterfaceCount?.validate(name: "\(name).networkInterfaceCount")
            try self.validate(self.onDemandMaxPricePercentageOverLowestPrice, name: "onDemandMaxPricePercentageOverLowestPrice", parent: name, min: 0)
            try self.validate(self.spotMaxPricePercentageOverLowestPrice, name: "spotMaxPricePercentageOverLowestPrice", parent: name, min: 0)
            try self.totalLocalStorageGB?.validate(name: "\(name).totalLocalStorageGB")
            try self.vCpuCount?.validate(name: "\(name).vCpuCount")
        }

        private enum CodingKeys: String, CodingKey {
            case acceleratorCount = "AcceleratorCount"
            case acceleratorManufacturers = "AcceleratorManufacturers"
            case acceleratorNames = "AcceleratorNames"
            case acceleratorTotalMemoryMiB = "AcceleratorTotalMemoryMiB"
            case acceleratorTypes = "AcceleratorTypes"
            case allowedInstanceTypes = "AllowedInstanceTypes"
            case bareMetal = "BareMetal"
            case baselineEbsBandwidthMbps = "BaselineEbsBandwidthMbps"
            case baselinePerformanceFactors = "BaselinePerformanceFactors"
            case burstablePerformance = "BurstablePerformance"
            case cpuManufacturers = "CpuManufacturers"
            case excludedInstanceTypes = "ExcludedInstanceTypes"
            case instanceGenerations = "InstanceGenerations"
            case localStorage = "LocalStorage"
            case localStorageTypes = "LocalStorageTypes"
            case maxSpotPriceAsPercentageOfOptimalOnDemandPrice = "MaxSpotPriceAsPercentageOfOptimalOnDemandPrice"
            case memoryGiBPerVCpu = "MemoryGiBPerVCpu"
            case memoryMiB = "MemoryMiB"
            case networkBandwidthGbps = "NetworkBandwidthGbps"
            case networkInterfaceCount = "NetworkInterfaceCount"
            case onDemandMaxPricePercentageOverLowestPrice = "OnDemandMaxPricePercentageOverLowestPrice"
            case requireHibernateSupport = "RequireHibernateSupport"
            case spotMaxPricePercentageOverLowestPrice = "SpotMaxPricePercentageOverLowestPrice"
            case totalLocalStorageGB = "TotalLocalStorageGB"
            case vCpuCount = "VCpuCount"
        }
    }

    public struct InstanceReusePolicy: AWSEncodableShape & AWSDecodableShape {
        /// Specifies whether instances in the Auto Scaling group can be returned to the warm pool on scale in.
        public let reuseOnScaleIn: Bool?

        @inlinable
        public init(reuseOnScaleIn: Bool? = nil) {
            self.reuseOnScaleIn = reuseOnScaleIn
        }

        private enum CodingKeys: String, CodingKey {
            case reuseOnScaleIn = "ReuseOnScaleIn"
        }
    }

    public struct InstancesDistribution: AWSEncodableShape & AWSDecodableShape {
        /// The allocation strategy to apply to your On-Demand Instances when they are launched. Possible instance types are determined by the launch template overrides that you specify. The following lists the valid values:  lowest-price  Uses price to determine which instance types are the highest priority, launching the lowest priced instance types within an Availability Zone first. This is the default value for Auto Scaling groups that specify  InstanceRequirements.   prioritized  You set the order of instance types for the launch template overrides from highest to lowest priority (from first to last in the list). Amazon EC2 Auto Scaling launches your highest priority instance types first. If all your On-Demand capacity cannot be fulfilled using your highest priority instance type, then Amazon EC2 Auto Scaling launches the remaining capacity using the second priority instance type, and so on. This is the default value for Auto Scaling groups that don't specify InstanceRequirements and cannot be used for groups that do.
        public let onDemandAllocationStrategy: String?
        /// The minimum amount of the Auto Scaling group's capacity that must be fulfilled by On-Demand Instances. This base portion is launched first as your group scales. This number has the same unit of measurement as the group's desired capacity. If you change the default unit of measurement (number of instances) by specifying weighted capacity values in your launch template overrides list, or by changing the default desired capacity type setting of the group, you must specify this number using the same unit of measurement. Default: 0
        public let onDemandBaseCapacity: Int?
        /// Controls the percentages of On-Demand Instances and Spot Instances for your additional capacity beyond OnDemandBaseCapacity. Expressed as a number (for example, 20 specifies 20% On-Demand Instances, 80% Spot Instances). If set to 100, only On-Demand Instances are used. Default: 100
        public let onDemandPercentageAboveBaseCapacity: Int?
        /// The allocation strategy to apply to your Spot Instances when they are launched. Possible instance types are determined by the launch template overrides that you specify. The following lists the valid values:  capacity-optimized  Requests Spot Instances using pools that are optimally chosen based on the available Spot capacity. This strategy has the lowest risk of interruption. To give certain instance types a higher chance of launching first, use capacity-optimized-prioritized.  capacity-optimized-prioritized  You set the order of instance types for the launch template overrides from highest to lowest priority (from first to last in the list). Amazon EC2 Auto Scaling honors the instance type priorities on a best effort basis but optimizes for capacity first. Note that if the On-Demand allocation strategy is set to prioritized, the same priority is applied when fulfilling On-Demand capacity. This is not a valid value for Auto Scaling groups that specify InstanceRequirements.  lowest-price  Requests Spot Instances using the lowest priced pools within an Availability Zone, across the number of Spot pools that you specify for the SpotInstancePools property. To ensure that your desired capacity is met, you might receive Spot Instances from several pools. This is the default value, but it might lead to high interruption rates because this strategy only considers instance price and not available capacity.  price-capacity-optimized (recommended)  The price and capacity optimized allocation strategy looks at both price and capacity to select the Spot Instance pools that are the least likely to be interrupted and have the lowest possible price.
        public let spotAllocationStrategy: String?
        /// The number of Spot Instance pools across which to allocate your Spot Instances. The Spot pools are determined from the different instance types in the overrides. Valid only when the SpotAllocationStrategy is lowest-price. Value must be in the range of 1–20. Default: 2
        public let spotInstancePools: Int?
        /// The maximum price per unit hour that you are willing to pay for a Spot Instance. If your maximum price is lower than the Spot price for the instance types that you selected, your Spot Instances are not launched. We do not recommend specifying a maximum price because it can lead to increased interruptions. When Spot Instances launch, you pay the current Spot price. To remove a maximum price that you previously set, include the property but specify an empty string ("") for the value.  If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify one.  Valid Range: Minimum value of 0.001
        public let spotMaxPrice: String?

        @inlinable
        public init(onDemandAllocationStrategy: String? = nil, onDemandBaseCapacity: Int? = nil, onDemandPercentageAboveBaseCapacity: Int? = nil, spotAllocationStrategy: String? = nil, spotInstancePools: Int? = nil, spotMaxPrice: String? = nil) {
            self.onDemandAllocationStrategy = onDemandAllocationStrategy
            self.onDemandBaseCapacity = onDemandBaseCapacity
            self.onDemandPercentageAboveBaseCapacity = onDemandPercentageAboveBaseCapacity
            self.spotAllocationStrategy = spotAllocationStrategy
            self.spotInstancePools = spotInstancePools
            self.spotMaxPrice = spotMaxPrice
        }

        public func validate(name: String) throws {
            try self.validate(self.onDemandAllocationStrategy, name: "onDemandAllocationStrategy", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.spotAllocationStrategy, name: "spotAllocationStrategy", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.spotMaxPrice, name: "spotMaxPrice", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case onDemandAllocationStrategy = "OnDemandAllocationStrategy"
            case onDemandBaseCapacity = "OnDemandBaseCapacity"
            case onDemandPercentageAboveBaseCapacity = "OnDemandPercentageAboveBaseCapacity"
            case spotAllocationStrategy = "SpotAllocationStrategy"
            case spotInstancePools = "SpotInstancePools"
            case spotMaxPrice = "SpotMaxPrice"
        }
    }

    public struct LaunchConfiguration: AWSDecodableShape {
        /// Specifies whether to assign a public IPv4 address to the group's instances. If the instance is launched into a default subnet, the default is to assign a public IPv4 address, unless you disabled the option to assign a public IPv4 address on the subnet. If the instance is launched into a nondefault subnet, the default is not to assign a public IPv4 address, unless you enabled the option to assign a public IPv4 address on the subnet. For more information, see Provide network connectivity for your Auto Scaling instances using Amazon VPC in the Amazon EC2 Auto Scaling User Guide.
        public let associatePublicIpAddress: Bool?
        /// The block device mapping entries that define the block devices to attach to the instances at launch. By default, the block devices specified in the block device mapping for the AMI are used. For more information, see Block device mappings in the Amazon EC2 User Guide.
        @OptionalCustomCoding<StandardArrayCoder<BlockDeviceMapping>>
        public var blockDeviceMappings: [BlockDeviceMapping]?
        /// Available for backward compatibility.
        public let classicLinkVPCId: String?
        /// Available for backward compatibility.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var classicLinkVPCSecurityGroups: [String]?
        /// The creation date and time for the launch configuration.
        public let createdTime: Date?
        /// Specifies whether the launch configuration is optimized for EBS I/O (true) or not (false). For more information, see Amazon EBS-optimized instances in the Amazon EC2 User Guide.
        public let ebsOptimized: Bool?
        /// The name or the Amazon Resource Name (ARN) of the instance profile associated with the IAM role for the instance. The instance profile contains the IAM role. For more information, see IAM role for applications that run on Amazon EC2 instances in the Amazon EC2 Auto Scaling User Guide.
        public let iamInstanceProfile: String?
        /// The ID of the Amazon Machine Image (AMI) to use to launch your EC2 instances. For more information, see Find a Linux AMI in the Amazon EC2 User Guide.
        public let imageId: String?
        /// Controls whether instances in this group are launched with detailed (true) or basic (false) monitoring. For more information, see Configure monitoring for Auto Scaling instances in the Amazon EC2 Auto Scaling User Guide.
        public let instanceMonitoring: InstanceMonitoring?
        /// The instance type for the instances. For information about available instance types, see Available instance types in the Amazon EC2 User Guide.
        public let instanceType: String?
        /// The ID of the kernel associated with the AMI.
        public let kernelId: String?
        /// The name of the key pair. For more information, see Amazon EC2 key pairs and Amazon EC2 instances in the Amazon EC2 User Guide.
        public let keyName: String?
        /// The Amazon Resource Name (ARN) of the launch configuration.
        public let launchConfigurationARN: String?
        /// The name of the launch configuration.
        public let launchConfigurationName: String?
        /// The metadata options for the instances. For more information, see Configure the instance metadata options in the Amazon EC2 Auto Scaling User Guide.
        public let metadataOptions: InstanceMetadataOptions?
        /// The tenancy of the instance, either default or dedicated. An instance with dedicated tenancy runs on isolated, single-tenant hardware and can only be launched into a VPC.
        public let placementTenancy: String?
        /// The ID of the RAM disk associated with the AMI.
        public let ramdiskId: String?
        /// A list that contains the security groups to assign to the instances in the Auto Scaling group. For more information, see Control traffic to your Amazon Web Services resources using security groups in the Amazon Virtual Private Cloud User Guide.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var securityGroups: [String]?
        /// The maximum hourly price to be paid for any Spot Instance launched to fulfill the request. Spot Instances are launched when the price you specify exceeds the current Spot price. For more information, see Requesting Spot Instances for fault-tolerant and flexible applications in the Amazon EC2 Auto Scaling User Guide.
        public let spotPrice: String?
        /// The user data to make available to the launched EC2 instances. For more information, see Instance metadata and user data in the Amazon EC2 User Guide. If you are using a command line tool, base64-encoding is performed for you, and you can load the text from a file. Otherwise, you must provide base64-encoded text. User data is limited to 16 KB.
        public let userData: String?

        @inlinable
        public init(associatePublicIpAddress: Bool? = nil, blockDeviceMappings: [BlockDeviceMapping]? = nil, classicLinkVPCId: String? = nil, classicLinkVPCSecurityGroups: [String]? = nil, createdTime: Date? = nil, ebsOptimized: Bool? = nil, iamInstanceProfile: String? = nil, imageId: String? = nil, instanceMonitoring: InstanceMonitoring? = nil, instanceType: String? = nil, kernelId: String? = nil, keyName: String? = nil, launchConfigurationARN: String? = nil, launchConfigurationName: String? = nil, metadataOptions: InstanceMetadataOptions? = nil, placementTenancy: String? = nil, ramdiskId: String? = nil, securityGroups: [String]? = nil, spotPrice: String? = nil, userData: String? = nil) {
            self.associatePublicIpAddress = associatePublicIpAddress
            self.blockDeviceMappings = blockDeviceMappings
            self.classicLinkVPCId = classicLinkVPCId
            self.classicLinkVPCSecurityGroups = classicLinkVPCSecurityGroups
            self.createdTime = createdTime
            self.ebsOptimized = ebsOptimized
            self.iamInstanceProfile = iamInstanceProfile
            self.imageId = imageId
            self.instanceMonitoring = instanceMonitoring
            self.instanceType = instanceType
            self.kernelId = kernelId
            self.keyName = keyName
            self.launchConfigurationARN = launchConfigurationARN
            self.launchConfigurationName = launchConfigurationName
            self.metadataOptions = metadataOptions
            self.placementTenancy = placementTenancy
            self.ramdiskId = ramdiskId
            self.securityGroups = securityGroups
            self.spotPrice = spotPrice
            self.userData = userData
        }

        private enum CodingKeys: String, CodingKey {
            case associatePublicIpAddress = "AssociatePublicIpAddress"
            case blockDeviceMappings = "BlockDeviceMappings"
            case classicLinkVPCId = "ClassicLinkVPCId"
            case classicLinkVPCSecurityGroups = "ClassicLinkVPCSecurityGroups"
            case createdTime = "CreatedTime"
            case ebsOptimized = "EbsOptimized"
            case iamInstanceProfile = "IamInstanceProfile"
            case imageId = "ImageId"
            case instanceMonitoring = "InstanceMonitoring"
            case instanceType = "InstanceType"
            case kernelId = "KernelId"
            case keyName = "KeyName"
            case launchConfigurationARN = "LaunchConfigurationARN"
            case launchConfigurationName = "LaunchConfigurationName"
            case metadataOptions = "MetadataOptions"
            case placementTenancy = "PlacementTenancy"
            case ramdiskId = "RamdiskId"
            case securityGroups = "SecurityGroups"
            case spotPrice = "SpotPrice"
            case userData = "UserData"
        }
    }

    public struct LaunchConfigurationNameType: AWSEncodableShape {
        /// The name of the launch configuration.
        public let launchConfigurationName: String?

        @inlinable
        public init(launchConfigurationName: String? = nil) {
            self.launchConfigurationName = launchConfigurationName
        }

        public func validate(name: String) throws {
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, max: 255)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, min: 1)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case launchConfigurationName = "LaunchConfigurationName"
        }
    }

    public struct LaunchConfigurationNamesType: AWSEncodableShape {
        /// The launch configuration names. If you omit this property, all launch configurations are described. Array Members: Maximum number of 50 items.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var launchConfigurationNames: [String]?
        /// The maximum number of items to return with this call. The default value is 50 and the maximum value is 100.
        public let maxRecords: Int?
        /// The token for the next set of items to return. (You received this token from a previous call.)
        public let nextToken: String?

        @inlinable
        public init(launchConfigurationNames: [String]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.launchConfigurationNames = launchConfigurationNames
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.launchConfigurationNames?.forEach {
                try validate($0, name: "launchConfigurationNames[]", parent: name, max: 255)
                try validate($0, name: "launchConfigurationNames[]", parent: name, min: 1)
                try validate($0, name: "launchConfigurationNames[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.nextToken, name: "nextToken", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case launchConfigurationNames = "LaunchConfigurationNames"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct LaunchConfigurationsType: AWSDecodableShape {
        /// The launch configurations.
        @OptionalCustomCoding<StandardArrayCoder<LaunchConfiguration>>
        public var launchConfigurations: [LaunchConfiguration]?
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?

        @inlinable
        public init(launchConfigurations: [LaunchConfiguration]? = nil, nextToken: String? = nil) {
            self.launchConfigurations = launchConfigurations
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case launchConfigurations = "LaunchConfigurations"
            case nextToken = "NextToken"
        }
    }

    public struct LaunchTemplate: AWSEncodableShape & AWSDecodableShape {
        /// The launch template.
        public let launchTemplateSpecification: LaunchTemplateSpecification?
        /// Any properties that you specify override the same properties in the launch template.
        @OptionalCustomCoding<StandardArrayCoder<LaunchTemplateOverrides>>
        public var overrides: [LaunchTemplateOverrides]?

        @inlinable
        public init(launchTemplateSpecification: LaunchTemplateSpecification? = nil, overrides: [LaunchTemplateOverrides]? = nil) {
            self.launchTemplateSpecification = launchTemplateSpecification
            self.overrides = overrides
        }

        public func validate(name: String) throws {
            try self.launchTemplateSpecification?.validate(name: "\(name).launchTemplateSpecification")
            try self.overrides?.forEach {
                try $0.validate(name: "\(name).overrides[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case launchTemplateSpecification = "LaunchTemplateSpecification"
            case overrides = "Overrides"
        }
    }

    public struct LaunchTemplateOverrides: AWSEncodableShape & AWSDecodableShape {
        /// The instance requirements. Amazon EC2 Auto Scaling uses your specified requirements to identify instance types. Then, it uses your On-Demand and Spot allocation strategies to launch instances from these instance types. You can specify up to four separate sets of instance requirements per Auto Scaling group. This is useful for provisioning instances from different Amazon Machine Images (AMIs) in the same Auto Scaling group. To do this, create the AMIs and create a new launch template for each AMI. Then, create a compatible set of instance requirements for each launch template.   If you specify InstanceRequirements, you can't specify InstanceType.
        public let instanceRequirements: InstanceRequirements?
        /// The instance type, such as m3.xlarge. You must specify an instance type that is supported in your requested Region and Availability Zones. For more information, see Instance types in the Amazon EC2 User Guide. You can specify up to 40 instance types per Auto Scaling group.
        public let instanceType: String?
        /// Provides a launch template for the specified instance type or set of instance requirements. For example, some instance types might require a launch template with a different AMI. If not provided, Amazon EC2 Auto Scaling uses the launch template that's specified in the LaunchTemplate definition. For more information, see Specifying a different launch template for an instance type in the Amazon EC2 Auto Scaling User Guide.  You can specify up to 20 launch templates per Auto Scaling group. The launch templates specified in the overrides and in the LaunchTemplate definition count towards this limit.
        public let launchTemplateSpecification: LaunchTemplateSpecification?
        /// If you provide a list of instance types to use, you can specify the number of capacity units provided by each instance type in terms of virtual CPUs, memory, storage, throughput, or other relative performance characteristic. When a Spot or On-Demand Instance is launched, the capacity units count toward the desired capacity. Amazon EC2 Auto Scaling launches instances until the desired capacity is totally fulfilled, even if this results in an overage. For example, if there are two units remaining to fulfill capacity, and Amazon EC2 Auto Scaling can only launch an instance with a WeightedCapacity of five units, the instance is launched, and the desired capacity is exceeded by three units. For more information, see Configure an Auto Scaling group to use instance weights in the Amazon EC2 Auto Scaling User Guide. Value must be in the range of 1–999. If you specify a value for WeightedCapacity for one instance type, you must specify a value for WeightedCapacity for all of them.  Every Auto Scaling group has three size parameters (DesiredCapacity, MaxSize, and MinSize). Usually, you set these sizes based on a specific number of instances. However, if you configure a mixed instances policy that defines weights for the instance types, you must specify these sizes with the same units that you use for weighting instances.
        public let weightedCapacity: String?

        @inlinable
        public init(instanceRequirements: InstanceRequirements? = nil, instanceType: String? = nil, launchTemplateSpecification: LaunchTemplateSpecification? = nil, weightedCapacity: String? = nil) {
            self.instanceRequirements = instanceRequirements
            self.instanceType = instanceType
            self.launchTemplateSpecification = launchTemplateSpecification
            self.weightedCapacity = weightedCapacity
        }

        public func validate(name: String) throws {
            try self.instanceRequirements?.validate(name: "\(name).instanceRequirements")
            try self.validate(self.instanceType, name: "instanceType", parent: name, max: 255)
            try self.validate(self.instanceType, name: "instanceType", parent: name, min: 1)
            try self.validate(self.instanceType, name: "instanceType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.launchTemplateSpecification?.validate(name: "\(name).launchTemplateSpecification")
            try self.validate(self.weightedCapacity, name: "weightedCapacity", parent: name, max: 32)
            try self.validate(self.weightedCapacity, name: "weightedCapacity", parent: name, min: 1)
            try self.validate(self.weightedCapacity, name: "weightedCapacity", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceRequirements = "InstanceRequirements"
            case instanceType = "InstanceType"
            case launchTemplateSpecification = "LaunchTemplateSpecification"
            case weightedCapacity = "WeightedCapacity"
        }
    }

    public struct LaunchTemplateSpecification: AWSEncodableShape & AWSDecodableShape {
        /// The ID of the launch template. To get the template ID, use the Amazon EC2 DescribeLaunchTemplates API operation. New launch templates can be created using the Amazon EC2 CreateLaunchTemplate API.  Conditional: You must specify either a LaunchTemplateId or a LaunchTemplateName.
        public let launchTemplateId: String?
        /// The name of the launch template. To get the template name, use the Amazon EC2 DescribeLaunchTemplates API operation. New launch templates can be created using the Amazon EC2 CreateLaunchTemplate API.  Conditional: You must specify either a LaunchTemplateId or a LaunchTemplateName.
        public let launchTemplateName: String?
        /// The version number, $Latest, or $Default. To get the version number, use the Amazon EC2 DescribeLaunchTemplateVersions API operation. New launch template versions can be created using the Amazon EC2 CreateLaunchTemplateVersion API. If the value is $Latest, Amazon EC2 Auto Scaling selects the latest version of the launch template when launching instances. If the value is $Default, Amazon EC2 Auto Scaling selects the default version of the launch template when launching instances. The default value is $Default.
        public let version: String?

        @inlinable
        public init(launchTemplateId: String? = nil, launchTemplateName: String? = nil, version: String? = nil) {
            self.launchTemplateId = launchTemplateId
            self.launchTemplateName = launchTemplateName
            self.version = version
        }

        public func validate(name: String) throws {
            try self.validate(self.launchTemplateId, name: "launchTemplateId", parent: name, max: 255)
            try self.validate(self.launchTemplateId, name: "launchTemplateId", parent: name, min: 1)
            try self.validate(self.launchTemplateId, name: "launchTemplateId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.launchTemplateName, name: "launchTemplateName", parent: name, max: 128)
            try self.validate(self.launchTemplateName, name: "launchTemplateName", parent: name, min: 3)
            try self.validate(self.launchTemplateName, name: "launchTemplateName", parent: name, pattern: "^[a-zA-Z0-9\\(\\)\\.\\-/_]+$")
            try self.validate(self.version, name: "version", parent: name, max: 255)
            try self.validate(self.version, name: "version", parent: name, min: 1)
            try self.validate(self.version, name: "version", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case launchTemplateId = "LaunchTemplateId"
            case launchTemplateName = "LaunchTemplateName"
            case version = "Version"
        }
    }

    public struct LifecycleHook: AWSDecodableShape {
        /// The name of the Auto Scaling group for the lifecycle hook.
        public let autoScalingGroupName: String?
        /// The action the Auto Scaling group takes when the lifecycle hook timeout elapses or if an unexpected failure occurs. Valid values: CONTINUE | ABANDON
        public let defaultResult: String?
        /// The maximum time, in seconds, that an instance can remain in a wait state. The maximum is 172800 seconds (48 hours) or 100 times HeartbeatTimeout, whichever is smaller.
        public let globalTimeout: Int?
        /// The maximum time, in seconds, that can elapse before the lifecycle hook times out. If the lifecycle hook times out, Amazon EC2 Auto Scaling performs the action that you specified in the DefaultResult property.
        public let heartbeatTimeout: Int?
        /// The name of the lifecycle hook.
        public let lifecycleHookName: String?
        /// The lifecycle transition. Valid values: autoscaling:EC2_INSTANCE_LAUNCHING | autoscaling:EC2_INSTANCE_TERMINATING
        public let lifecycleTransition: String?
        /// Additional information that is included any time Amazon EC2 Auto Scaling sends a message to the notification target.
        public let notificationMetadata: String?
        /// The ARN of the target that Amazon EC2 Auto Scaling sends notifications to when an instance is in a wait state for the lifecycle hook.
        public let notificationTargetARN: String?
        /// The ARN of the IAM role that allows the Auto Scaling group to publish to the specified notification target (an Amazon SNS topic or an Amazon SQS queue).
        public let roleARN: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, defaultResult: String? = nil, globalTimeout: Int? = nil, heartbeatTimeout: Int? = nil, lifecycleHookName: String? = nil, lifecycleTransition: String? = nil, notificationMetadata: String? = nil, notificationTargetARN: String? = nil, roleARN: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.defaultResult = defaultResult
            self.globalTimeout = globalTimeout
            self.heartbeatTimeout = heartbeatTimeout
            self.lifecycleHookName = lifecycleHookName
            self.lifecycleTransition = lifecycleTransition
            self.notificationMetadata = notificationMetadata
            self.notificationTargetARN = notificationTargetARN
            self.roleARN = roleARN
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case defaultResult = "DefaultResult"
            case globalTimeout = "GlobalTimeout"
            case heartbeatTimeout = "HeartbeatTimeout"
            case lifecycleHookName = "LifecycleHookName"
            case lifecycleTransition = "LifecycleTransition"
            case notificationMetadata = "NotificationMetadata"
            case notificationTargetARN = "NotificationTargetARN"
            case roleARN = "RoleARN"
        }
    }

    public struct LifecycleHookSpecification: AWSEncodableShape {
        /// The action the Auto Scaling group takes when the lifecycle hook timeout elapses or if an unexpected failure occurs. The default value is ABANDON. Valid values: CONTINUE | ABANDON
        public let defaultResult: String?
        /// The maximum time, in seconds, that can elapse before the lifecycle hook times out. The range is from 30 to 7200 seconds. The default value is 3600 seconds (1 hour).
        public let heartbeatTimeout: Int?
        /// The name of the lifecycle hook.
        public let lifecycleHookName: String?
        /// The lifecycle transition. For Auto Scaling groups, there are two major lifecycle transitions.   To create a lifecycle hook for scale-out events, specify autoscaling:EC2_INSTANCE_LAUNCHING.   To create a lifecycle hook for scale-in events, specify autoscaling:EC2_INSTANCE_TERMINATING.
        public let lifecycleTransition: String?
        /// Additional information that you want to include any time Amazon EC2 Auto Scaling sends a message to the notification target.
        public let notificationMetadata: String?
        /// The Amazon Resource Name (ARN) of the notification target that Amazon EC2 Auto Scaling sends notifications to when an instance is in a wait state for the lifecycle hook. You can specify an Amazon SNS topic or an Amazon SQS queue.
        public let notificationTargetARN: String?
        /// The ARN of the IAM role that allows the Auto Scaling group to publish to the specified notification target. For information about creating this role, see Prepare to add a lifecycle hook to your Auto Scaling group in the Amazon EC2 Auto Scaling User Guide. Valid only if the notification target is an Amazon SNS topic or an Amazon SQS queue.
        public let roleARN: String?

        @inlinable
        public init(defaultResult: String? = nil, heartbeatTimeout: Int? = nil, lifecycleHookName: String? = nil, lifecycleTransition: String? = nil, notificationMetadata: String? = nil, notificationTargetARN: String? = nil, roleARN: String? = nil) {
            self.defaultResult = defaultResult
            self.heartbeatTimeout = heartbeatTimeout
            self.lifecycleHookName = lifecycleHookName
            self.lifecycleTransition = lifecycleTransition
            self.notificationMetadata = notificationMetadata
            self.notificationTargetARN = notificationTargetARN
            self.roleARN = roleARN
        }

        public func validate(name: String) throws {
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, max: 255)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, min: 1)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
            try self.validate(self.notificationMetadata, name: "notificationMetadata", parent: name, max: 4000)
            try self.validate(self.notificationMetadata, name: "notificationMetadata", parent: name, min: 1)
            try self.validate(self.notificationMetadata, name: "notificationMetadata", parent: name, pattern: "^[\\u0009\\u000A\\u000D\\u0020-\\u007e]+$")
            try self.validate(self.notificationTargetARN, name: "notificationTargetARN", parent: name, max: 255)
            try self.validate(self.notificationTargetARN, name: "notificationTargetARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.roleARN, name: "roleARN", parent: name, max: 255)
            try self.validate(self.roleARN, name: "roleARN", parent: name, min: 1)
            try self.validate(self.roleARN, name: "roleARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case defaultResult = "DefaultResult"
            case heartbeatTimeout = "HeartbeatTimeout"
            case lifecycleHookName = "LifecycleHookName"
            case lifecycleTransition = "LifecycleTransition"
            case notificationMetadata = "NotificationMetadata"
            case notificationTargetARN = "NotificationTargetARN"
            case roleARN = "RoleARN"
        }
    }

    public struct LoadBalancerState: AWSDecodableShape {
        /// The name of the load balancer.
        public let loadBalancerName: String?
        /// One of the following load balancer states:    Adding - The Auto Scaling instances are being registered with the load balancer.    Added - All Auto Scaling instances are registered with the load balancer.    InService - At least one Auto Scaling instance passed an ELB health check.    Removing - The Auto Scaling instances are being deregistered from the load balancer. If connection draining is enabled, Elastic Load Balancing waits for in-flight requests to complete before deregistering the instances.    Removed - All Auto Scaling instances are deregistered from the load balancer.
        public let state: String?

        @inlinable
        public init(loadBalancerName: String? = nil, state: String? = nil) {
            self.loadBalancerName = loadBalancerName
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerName = "LoadBalancerName"
            case state = "State"
        }
    }

    public struct LoadBalancerTargetGroupState: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the target group.
        public let loadBalancerTargetGroupARN: String?
        /// The state of the target group.    Adding - The Auto Scaling instances are being registered with the target group.    Added - All Auto Scaling instances are registered with the target group.    InService - At least one Auto Scaling instance passed an ELB health check.    Removing - The Auto Scaling instances are being deregistered from the target group. If connection draining is enabled, Elastic Load Balancing waits for in-flight requests to complete before deregistering the instances.    Removed - All Auto Scaling instances are deregistered from the target group.
        public let state: String?

        @inlinable
        public init(loadBalancerTargetGroupARN: String? = nil, state: String? = nil) {
            self.loadBalancerTargetGroupARN = loadBalancerTargetGroupARN
            self.state = state
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancerTargetGroupARN = "LoadBalancerTargetGroupARN"
            case state = "State"
        }
    }

    public struct LoadForecast: AWSDecodableShape {
        /// The metric specification for the load forecast.
        public let metricSpecification: PredictiveScalingMetricSpecification?
        /// The timestamps for the data points, in UTC format.
        @OptionalCustomCoding<StandardArrayCoder<Date>>
        public var timestamps: [Date]?
        /// The values of the data points.
        @OptionalCustomCoding<StandardArrayCoder<Double>>
        public var values: [Double]?

        @inlinable
        public init(metricSpecification: PredictiveScalingMetricSpecification? = nil, timestamps: [Date]? = nil, values: [Double]? = nil) {
            self.metricSpecification = metricSpecification
            self.timestamps = timestamps
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case metricSpecification = "MetricSpecification"
            case timestamps = "Timestamps"
            case values = "Values"
        }
    }

    public struct MemoryGiBPerVCpuRequest: AWSEncodableShape & AWSDecodableShape {
        /// The memory maximum in GiB.
        public let max: Double?
        /// The memory minimum in GiB.
        public let min: Double?

        @inlinable
        public init(max: Double? = nil, min: Double? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0.0)
            try self.validate(self.min, name: "min", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct MemoryMiBRequest: AWSEncodableShape & AWSDecodableShape {
        /// The memory maximum in MiB.
        public let max: Int?
        /// The memory minimum in MiB.
        public let min: Int?

        @inlinable
        public init(max: Int? = nil, min: Int? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0)
            try self.validate(self.min, name: "min", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct Metric: AWSEncodableShape & AWSDecodableShape {
        /// The dimensions for the metric. For the list of available dimensions, see the Amazon Web Services documentation available from the table in Amazon Web Services services that publish CloudWatch metrics  in the Amazon CloudWatch User Guide.  Conditional: If you published your metric with dimensions, you must specify the same dimensions in your scaling policy.
        @OptionalCustomCoding<StandardArrayCoder<MetricDimension>>
        public var dimensions: [MetricDimension]?
        /// The name of the metric.
        public let metricName: String?
        /// The namespace of the metric. For more information, see the table in Amazon Web Services services that publish CloudWatch metrics  in the Amazon CloudWatch User Guide.
        public let namespace: String?

        @inlinable
        public init(dimensions: [MetricDimension]? = nil, metricName: String? = nil, namespace: String? = nil) {
            self.dimensions = dimensions
            self.metricName = metricName
            self.namespace = namespace
        }

        private enum CodingKeys: String, CodingKey {
            case dimensions = "Dimensions"
            case metricName = "MetricName"
            case namespace = "Namespace"
        }
    }

    public struct MetricCollectionType: AWSDecodableShape {
        /// One of the following metrics:    GroupMinSize     GroupMaxSize     GroupDesiredCapacity     GroupInServiceInstances     GroupPendingInstances     GroupStandbyInstances     GroupTerminatingInstances     GroupTotalInstances     GroupInServiceCapacity     GroupPendingCapacity     GroupStandbyCapacity     GroupTerminatingCapacity     GroupTotalCapacity     WarmPoolDesiredCapacity     WarmPoolWarmedCapacity     WarmPoolPendingCapacity     WarmPoolTerminatingCapacity     WarmPoolTotalCapacity     GroupAndWarmPoolDesiredCapacity     GroupAndWarmPoolTotalCapacity
        public let metric: String?

        @inlinable
        public init(metric: String? = nil) {
            self.metric = metric
        }

        private enum CodingKeys: String, CodingKey {
            case metric = "Metric"
        }
    }

    public struct MetricDataQuery: AWSEncodableShape & AWSDecodableShape {
        /// The math expression to perform on the returned data, if this object is performing a math expression. This expression can use the Id of the other metrics to refer to those metrics, and can also use the Id of other expressions to use the result of those expressions.  Conditional: Within each MetricDataQuery object, you must specify either Expression or MetricStat, but not both.
        public let expression: String?
        /// A short name that identifies the object's results in the response. This name must be unique among all MetricDataQuery objects specified for a single scaling policy. If you are performing math expressions on this set of data, this name represents that data and can serve as a variable in the mathematical expression. The valid characters are letters, numbers, and underscores. The first character must be a lowercase letter.
        public let id: String?
        /// A human-readable label for this metric or expression. This is especially useful if this is a math expression, so that you know what the value represents.
        public let label: String?
        /// Information about the metric data to return. Conditional: Within each MetricDataQuery object, you must specify either Expression or MetricStat, but not both.
        public let metricStat: MetricStat?
        /// Indicates whether to return the timestamps and raw data values of this metric.  If you use any math expressions, specify true for this value for only the final math expression that the metric specification is based on. You must specify false for ReturnData for all the other metrics and expressions used in the metric specification. If you are only retrieving metrics and not performing any math expressions, do not specify anything for ReturnData. This sets it to its default (true).
        public let returnData: Bool?

        @inlinable
        public init(expression: String? = nil, id: String? = nil, label: String? = nil, metricStat: MetricStat? = nil, returnData: Bool? = nil) {
            self.expression = expression
            self.id = id
            self.label = label
            self.metricStat = metricStat
            self.returnData = returnData
        }

        public func validate(name: String) throws {
            try self.validate(self.expression, name: "expression", parent: name, max: 1023)
            try self.validate(self.expression, name: "expression", parent: name, min: 1)
            try self.validate(self.expression, name: "expression", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.id, name: "id", parent: name, max: 255)
            try self.validate(self.id, name: "id", parent: name, min: 1)
            try self.validate(self.id, name: "id", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.label, name: "label", parent: name, max: 2047)
            try self.validate(self.label, name: "label", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.metricStat?.validate(name: "\(name).metricStat")
        }

        private enum CodingKeys: String, CodingKey {
            case expression = "Expression"
            case id = "Id"
            case label = "Label"
            case metricStat = "MetricStat"
            case returnData = "ReturnData"
        }
    }

    public struct MetricDimension: AWSEncodableShape & AWSDecodableShape {
        /// The name of the dimension.
        public let name: String?
        /// The value of the dimension.
        public let value: String?

        @inlinable
        public init(name: String? = nil, value: String? = nil) {
            self.name = name
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case value = "Value"
        }
    }

    public struct MetricGranularityType: AWSDecodableShape {
        /// The granularity. The only valid value is 1Minute.
        public let granularity: String?

        @inlinable
        public init(granularity: String? = nil) {
            self.granularity = granularity
        }

        private enum CodingKeys: String, CodingKey {
            case granularity = "Granularity"
        }
    }

    public struct MetricStat: AWSEncodableShape & AWSDecodableShape {
        /// The CloudWatch metric to return, including the metric name, namespace, and dimensions. To get the exact metric name, namespace, and dimensions, inspect the Metric object that is returned by a call to ListMetrics.
        public let metric: Metric?
        /// The statistic to return. It can include any CloudWatch statistic or extended statistic. For a list of valid values, see the table in Statistics in the Amazon CloudWatch User Guide. The most commonly used metrics for predictive scaling are Average and Sum.
        public let stat: String?
        /// The unit to use for the returned data points. For a complete list of the units that CloudWatch supports, see the MetricDatum data type in the Amazon CloudWatch API Reference.
        public let unit: String?

        @inlinable
        public init(metric: Metric? = nil, stat: String? = nil, unit: String? = nil) {
            self.metric = metric
            self.stat = stat
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.stat, name: "stat", parent: name, max: 100)
            try self.validate(self.stat, name: "stat", parent: name, min: 1)
            try self.validate(self.stat, name: "stat", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case metric = "Metric"
            case stat = "Stat"
            case unit = "Unit"
        }
    }

    public struct MixedInstancesPolicy: AWSEncodableShape & AWSDecodableShape {
        /// The instances distribution.
        public let instancesDistribution: InstancesDistribution?
        /// One or more launch templates and the instance types (overrides) that are used to launch EC2 instances to fulfill On-Demand and Spot capacities.
        public let launchTemplate: LaunchTemplate?

        @inlinable
        public init(instancesDistribution: InstancesDistribution? = nil, launchTemplate: LaunchTemplate? = nil) {
            self.instancesDistribution = instancesDistribution
            self.launchTemplate = launchTemplate
        }

        public func validate(name: String) throws {
            try self.instancesDistribution?.validate(name: "\(name).instancesDistribution")
            try self.launchTemplate?.validate(name: "\(name).launchTemplate")
        }

        private enum CodingKeys: String, CodingKey {
            case instancesDistribution = "InstancesDistribution"
            case launchTemplate = "LaunchTemplate"
        }
    }

    public struct NetworkBandwidthGbpsRequest: AWSEncodableShape & AWSDecodableShape {
        /// The maximum amount of network bandwidth, in gigabits per second (Gbps).
        public let max: Double?
        /// The minimum amount of network bandwidth, in gigabits per second (Gbps).
        public let min: Double?

        @inlinable
        public init(max: Double? = nil, min: Double? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0.0)
            try self.validate(self.min, name: "min", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct NetworkInterfaceCountRequest: AWSEncodableShape & AWSDecodableShape {
        /// The maximum number of network interfaces.
        public let max: Int?
        /// The minimum number of network interfaces.
        public let min: Int?

        @inlinable
        public init(max: Int? = nil, min: Int? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0)
            try self.validate(self.min, name: "min", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct NotificationConfiguration: AWSDecodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// One of the following event notification types:    autoscaling:EC2_INSTANCE_LAUNCH     autoscaling:EC2_INSTANCE_LAUNCH_ERROR     autoscaling:EC2_INSTANCE_TERMINATE     autoscaling:EC2_INSTANCE_TERMINATE_ERROR     autoscaling:TEST_NOTIFICATION
        public let notificationType: String?
        /// The Amazon Resource Name (ARN) of the Amazon SNS topic.
        public let topicARN: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, notificationType: String? = nil, topicARN: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.notificationType = notificationType
            self.topicARN = topicARN
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case notificationType = "NotificationType"
            case topicARN = "TopicARN"
        }
    }

    public struct PerformanceFactorReferenceRequest: AWSEncodableShape & AWSDecodableShape {
        ///  The instance family to use as a baseline reference.   Make sure that you specify the correct value for the instance family. The instance family is everything before the period (.) in the instance type name. For example, in the instance c6i.large, the instance family is c6i, not c6. For more information, see Amazon EC2 instance type naming conventions in  Amazon EC2 Instance Types.  The following instance types are not supported for performance protection.    c1     g3| g3s     hpc7g     m1| m2     mac1 | mac2 | mac2-m1ultra | mac2-m2 | mac2-m2pro     p3dn | p4d | p5     t1     u-12tb1 | u-18tb1 | u-24tb1 | u-3tb1 | u-6tb1 | u-9tb1 | u7i-12tb | u7in-16tb | u7in-24tb | u7in-32tb    If you performance protection by specifying a supported instance family, the returned instance types will exclude the preceding unsupported instance families. If you specify an unsupported instance family as a value for baseline performance, the API returns an empty response.
        public let instanceFamily: String?

        @inlinable
        public init(instanceFamily: String? = nil) {
            self.instanceFamily = instanceFamily
        }

        private enum CodingKeys: String, CodingKey {
            case instanceFamily = "InstanceFamily"
        }
    }

    public struct PoliciesType: AWSDecodableShape {
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?
        /// The scaling policies.
        @OptionalCustomCoding<StandardArrayCoder<ScalingPolicy>>
        public var scalingPolicies: [ScalingPolicy]?

        @inlinable
        public init(nextToken: String? = nil, scalingPolicies: [ScalingPolicy]? = nil) {
            self.nextToken = nextToken
            self.scalingPolicies = scalingPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case scalingPolicies = "ScalingPolicies"
        }
    }

    public struct PolicyARNType: AWSDecodableShape {
        /// The CloudWatch alarms created for the target tracking scaling policy.
        @OptionalCustomCoding<StandardArrayCoder<Alarm>>
        public var alarms: [Alarm]?
        /// The Amazon Resource Name (ARN) of the policy.
        public let policyARN: String?

        @inlinable
        public init(alarms: [Alarm]? = nil, policyARN: String? = nil) {
            self.alarms = alarms
            self.policyARN = policyARN
        }

        private enum CodingKeys: String, CodingKey {
            case alarms = "Alarms"
            case policyARN = "PolicyARN"
        }
    }

    public struct PredefinedMetricSpecification: AWSEncodableShape & AWSDecodableShape {
        /// The metric type. The following predefined metrics are available:    ASGAverageCPUUtilization - Average CPU utilization of the Auto Scaling group.    ASGAverageNetworkIn - Average number of bytes received on all network interfaces by the Auto Scaling group.    ASGAverageNetworkOut - Average number of bytes sent out on all network interfaces by the Auto Scaling group.    ALBRequestCountPerTarget - Average Application Load Balancer request count per target for your Auto Scaling group.
        public let predefinedMetricType: MetricType?
        /// A label that uniquely identifies a specific Application Load Balancer target group from which to determine the average request count served by your Auto Scaling group. You can't specify a resource label unless the target group is attached to the Auto Scaling group. You create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:  app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff. Where:   app// is the final portion of the load balancer ARN   targetgroup// is the final portion of the target group ARN.   To find the ARN for an Application Load Balancer, use the DescribeLoadBalancers API operation. To find the ARN for the target group, use the DescribeTargetGroups API operation.
        public let resourceLabel: String?

        @inlinable
        public init(predefinedMetricType: MetricType? = nil, resourceLabel: String? = nil) {
            self.predefinedMetricType = predefinedMetricType
            self.resourceLabel = resourceLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, max: 1023)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, min: 1)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case predefinedMetricType = "PredefinedMetricType"
            case resourceLabel = "ResourceLabel"
        }
    }

    public struct PredictiveScalingConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// Defines the behavior that should be applied if the forecast capacity approaches or exceeds the maximum capacity of the Auto Scaling group. Defaults to HonorMaxCapacity if not specified. The following are possible values:    HonorMaxCapacity - Amazon EC2 Auto Scaling can't increase the maximum capacity of the group when the forecast capacity is close to or exceeds the maximum capacity.    IncreaseMaxCapacity - Amazon EC2 Auto Scaling can increase the maximum capacity of the group when the forecast capacity is close to or exceeds the maximum capacity. The upper limit is determined by the forecasted capacity and the value for MaxCapacityBuffer.    Use caution when allowing the maximum capacity to be automatically increased. This can lead to more instances being launched than intended if the increased maximum capacity is not monitored and managed. The increased maximum capacity then becomes the new normal maximum capacity for the Auto Scaling group until you manually update it. The maximum capacity does not automatically decrease back to the original maximum.
        public let maxCapacityBreachBehavior: PredictiveScalingMaxCapacityBreachBehavior?
        /// The size of the capacity buffer to use when the forecast capacity is close to or exceeds the maximum capacity. The value is specified as a percentage relative to the forecast capacity. For example, if the buffer is 10, this means a 10 percent buffer, such that if the forecast capacity is 50, and the maximum capacity is 40, then the effective maximum capacity is 55. If set to 0, Amazon EC2 Auto Scaling may scale capacity higher than the maximum capacity to equal but not exceed forecast capacity.  Required if the MaxCapacityBreachBehavior property is set to IncreaseMaxCapacity, and cannot be used otherwise.
        public let maxCapacityBuffer: Int?
        /// This structure includes the metrics and target utilization to use for predictive scaling.  This is an array, but we currently only support a single metric specification. That is, you can specify a target value and a single metric pair, or a target value and one scaling metric and one load metric.
        @OptionalCustomCoding<StandardArrayCoder<PredictiveScalingMetricSpecification>>
        public var metricSpecifications: [PredictiveScalingMetricSpecification]?
        /// The predictive scaling mode. Defaults to ForecastOnly if not specified.
        public let mode: PredictiveScalingMode?
        /// The amount of time, in seconds, by which the instance launch time can be advanced. For example, the forecast says to add capacity at 10:00 AM, and you choose to pre-launch instances by 5 minutes. In that case, the instances will be launched at 9:55 AM. The intention is to give resources time to be provisioned. It can take a few minutes to launch an EC2 instance. The actual amount of time required depends on several factors, such as the size of the instance and whether there are startup scripts to complete.  The value must be less than the forecast interval duration of 3600 seconds (60 minutes). Defaults to 300 seconds if not specified.
        public let schedulingBufferTime: Int?

        @inlinable
        public init(maxCapacityBreachBehavior: PredictiveScalingMaxCapacityBreachBehavior? = nil, maxCapacityBuffer: Int? = nil, metricSpecifications: [PredictiveScalingMetricSpecification]? = nil, mode: PredictiveScalingMode? = nil, schedulingBufferTime: Int? = nil) {
            self.maxCapacityBreachBehavior = maxCapacityBreachBehavior
            self.maxCapacityBuffer = maxCapacityBuffer
            self.metricSpecifications = metricSpecifications
            self.mode = mode
            self.schedulingBufferTime = schedulingBufferTime
        }

        public func validate(name: String) throws {
            try self.validate(self.maxCapacityBuffer, name: "maxCapacityBuffer", parent: name, max: 100)
            try self.validate(self.maxCapacityBuffer, name: "maxCapacityBuffer", parent: name, min: 0)
            try self.metricSpecifications?.forEach {
                try $0.validate(name: "\(name).metricSpecifications[]")
            }
            try self.validate(self.schedulingBufferTime, name: "schedulingBufferTime", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case maxCapacityBreachBehavior = "MaxCapacityBreachBehavior"
            case maxCapacityBuffer = "MaxCapacityBuffer"
            case metricSpecifications = "MetricSpecifications"
            case mode = "Mode"
            case schedulingBufferTime = "SchedulingBufferTime"
        }
    }

    public struct PredictiveScalingCustomizedCapacityMetric: AWSEncodableShape & AWSDecodableShape {
        /// One or more metric data queries to provide the data points for a capacity metric. Use multiple metric data queries only if you are performing a math expression on returned data.
        @OptionalCustomCoding<StandardArrayCoder<MetricDataQuery>>
        public var metricDataQueries: [MetricDataQuery]?

        @inlinable
        public init(metricDataQueries: [MetricDataQuery]? = nil) {
            self.metricDataQueries = metricDataQueries
        }

        public func validate(name: String) throws {
            try self.metricDataQueries?.forEach {
                try $0.validate(name: "\(name).metricDataQueries[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case metricDataQueries = "MetricDataQueries"
        }
    }

    public struct PredictiveScalingCustomizedLoadMetric: AWSEncodableShape & AWSDecodableShape {
        /// One or more metric data queries to provide the data points for a load metric. Use multiple metric data queries only if you are performing a math expression on returned data.
        @OptionalCustomCoding<StandardArrayCoder<MetricDataQuery>>
        public var metricDataQueries: [MetricDataQuery]?

        @inlinable
        public init(metricDataQueries: [MetricDataQuery]? = nil) {
            self.metricDataQueries = metricDataQueries
        }

        public func validate(name: String) throws {
            try self.metricDataQueries?.forEach {
                try $0.validate(name: "\(name).metricDataQueries[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case metricDataQueries = "MetricDataQueries"
        }
    }

    public struct PredictiveScalingCustomizedScalingMetric: AWSEncodableShape & AWSDecodableShape {
        /// One or more metric data queries to provide the data points for a scaling metric. Use multiple metric data queries only if you are performing a math expression on returned data.
        @OptionalCustomCoding<StandardArrayCoder<MetricDataQuery>>
        public var metricDataQueries: [MetricDataQuery]?

        @inlinable
        public init(metricDataQueries: [MetricDataQuery]? = nil) {
            self.metricDataQueries = metricDataQueries
        }

        public func validate(name: String) throws {
            try self.metricDataQueries?.forEach {
                try $0.validate(name: "\(name).metricDataQueries[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case metricDataQueries = "MetricDataQueries"
        }
    }

    public struct PredictiveScalingMetricSpecification: AWSEncodableShape & AWSDecodableShape {
        /// The customized capacity metric specification.
        public let customizedCapacityMetricSpecification: PredictiveScalingCustomizedCapacityMetric?
        /// The customized load metric specification.
        public let customizedLoadMetricSpecification: PredictiveScalingCustomizedLoadMetric?
        /// The customized scaling metric specification.
        public let customizedScalingMetricSpecification: PredictiveScalingCustomizedScalingMetric?
        /// The predefined load metric specification.
        public let predefinedLoadMetricSpecification: PredictiveScalingPredefinedLoadMetric?
        /// The predefined metric pair specification from which Amazon EC2 Auto Scaling determines the appropriate scaling metric and load metric to use.
        public let predefinedMetricPairSpecification: PredictiveScalingPredefinedMetricPair?
        /// The predefined scaling metric specification.
        public let predefinedScalingMetricSpecification: PredictiveScalingPredefinedScalingMetric?
        /// Specifies the target utilization.  Some metrics are based on a count instead of a percentage, such as the request count for an Application Load Balancer or the number of messages in an SQS queue. If the scaling policy specifies one of these metrics, specify the target utilization as the optimal average request or message count per instance during any one-minute interval.
        public let targetValue: Double?

        @inlinable
        public init(customizedCapacityMetricSpecification: PredictiveScalingCustomizedCapacityMetric? = nil, customizedLoadMetricSpecification: PredictiveScalingCustomizedLoadMetric? = nil, customizedScalingMetricSpecification: PredictiveScalingCustomizedScalingMetric? = nil, predefinedLoadMetricSpecification: PredictiveScalingPredefinedLoadMetric? = nil, predefinedMetricPairSpecification: PredictiveScalingPredefinedMetricPair? = nil, predefinedScalingMetricSpecification: PredictiveScalingPredefinedScalingMetric? = nil, targetValue: Double? = nil) {
            self.customizedCapacityMetricSpecification = customizedCapacityMetricSpecification
            self.customizedLoadMetricSpecification = customizedLoadMetricSpecification
            self.customizedScalingMetricSpecification = customizedScalingMetricSpecification
            self.predefinedLoadMetricSpecification = predefinedLoadMetricSpecification
            self.predefinedMetricPairSpecification = predefinedMetricPairSpecification
            self.predefinedScalingMetricSpecification = predefinedScalingMetricSpecification
            self.targetValue = targetValue
        }

        public func validate(name: String) throws {
            try self.customizedCapacityMetricSpecification?.validate(name: "\(name).customizedCapacityMetricSpecification")
            try self.customizedLoadMetricSpecification?.validate(name: "\(name).customizedLoadMetricSpecification")
            try self.customizedScalingMetricSpecification?.validate(name: "\(name).customizedScalingMetricSpecification")
            try self.predefinedLoadMetricSpecification?.validate(name: "\(name).predefinedLoadMetricSpecification")
            try self.predefinedMetricPairSpecification?.validate(name: "\(name).predefinedMetricPairSpecification")
            try self.predefinedScalingMetricSpecification?.validate(name: "\(name).predefinedScalingMetricSpecification")
        }

        private enum CodingKeys: String, CodingKey {
            case customizedCapacityMetricSpecification = "CustomizedCapacityMetricSpecification"
            case customizedLoadMetricSpecification = "CustomizedLoadMetricSpecification"
            case customizedScalingMetricSpecification = "CustomizedScalingMetricSpecification"
            case predefinedLoadMetricSpecification = "PredefinedLoadMetricSpecification"
            case predefinedMetricPairSpecification = "PredefinedMetricPairSpecification"
            case predefinedScalingMetricSpecification = "PredefinedScalingMetricSpecification"
            case targetValue = "TargetValue"
        }
    }

    public struct PredictiveScalingPredefinedLoadMetric: AWSEncodableShape & AWSDecodableShape {
        /// The metric type.
        public let predefinedMetricType: PredefinedLoadMetricType?
        /// A label that uniquely identifies a specific Application Load Balancer target group from which to determine the request count served by your Auto Scaling group. You can't specify a resource label unless the target group is attached to the Auto Scaling group. You create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:  app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff. Where:   app// is the final portion of the load balancer ARN   targetgroup// is the final portion of the target group ARN.   To find the ARN for an Application Load Balancer, use the DescribeLoadBalancers API operation. To find the ARN for the target group, use the DescribeTargetGroups API operation.
        public let resourceLabel: String?

        @inlinable
        public init(predefinedMetricType: PredefinedLoadMetricType? = nil, resourceLabel: String? = nil) {
            self.predefinedMetricType = predefinedMetricType
            self.resourceLabel = resourceLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, max: 1023)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, min: 1)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case predefinedMetricType = "PredefinedMetricType"
            case resourceLabel = "ResourceLabel"
        }
    }

    public struct PredictiveScalingPredefinedMetricPair: AWSEncodableShape & AWSDecodableShape {
        /// Indicates which metrics to use. There are two different types of metrics for each metric type: one is a load metric and one is a scaling metric. For example, if the metric type is ASGCPUUtilization, the Auto Scaling group's total CPU metric is used as the load metric, and the average CPU metric is used for the scaling metric.
        public let predefinedMetricType: PredefinedMetricPairType?
        /// A label that uniquely identifies a specific Application Load Balancer target group from which to determine the total and average request count served by your Auto Scaling group. You can't specify a resource label unless the target group is attached to the Auto Scaling group. You create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:  app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff. Where:   app// is the final portion of the load balancer ARN   targetgroup// is the final portion of the target group ARN.   To find the ARN for an Application Load Balancer, use the DescribeLoadBalancers API operation. To find the ARN for the target group, use the DescribeTargetGroups API operation.
        public let resourceLabel: String?

        @inlinable
        public init(predefinedMetricType: PredefinedMetricPairType? = nil, resourceLabel: String? = nil) {
            self.predefinedMetricType = predefinedMetricType
            self.resourceLabel = resourceLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, max: 1023)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, min: 1)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case predefinedMetricType = "PredefinedMetricType"
            case resourceLabel = "ResourceLabel"
        }
    }

    public struct PredictiveScalingPredefinedScalingMetric: AWSEncodableShape & AWSDecodableShape {
        /// The metric type.
        public let predefinedMetricType: PredefinedScalingMetricType?
        /// A label that uniquely identifies a specific Application Load Balancer target group from which to determine the average request count served by your Auto Scaling group. You can't specify a resource label unless the target group is attached to the Auto Scaling group. You create the resource label by appending the final portion of the load balancer ARN and the final portion of the target group ARN into a single value, separated by a forward slash (/). The format of the resource label is:  app/my-alb/778d41231b141a0f/targetgroup/my-alb-target-group/943f017f100becff. Where:   app// is the final portion of the load balancer ARN   targetgroup// is the final portion of the target group ARN.   To find the ARN for an Application Load Balancer, use the DescribeLoadBalancers API operation. To find the ARN for the target group, use the DescribeTargetGroups API operation.
        public let resourceLabel: String?

        @inlinable
        public init(predefinedMetricType: PredefinedScalingMetricType? = nil, resourceLabel: String? = nil) {
            self.predefinedMetricType = predefinedMetricType
            self.resourceLabel = resourceLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, max: 1023)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, min: 1)
            try self.validate(self.resourceLabel, name: "resourceLabel", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case predefinedMetricType = "PredefinedMetricType"
            case resourceLabel = "ResourceLabel"
        }
    }

    public struct ProcessType: AWSDecodableShape {
        /// One of the following processes:    Launch     Terminate     AddToLoadBalancer     AlarmNotification     AZRebalance     HealthCheck     InstanceRefresh     ReplaceUnhealthy     ScheduledActions
        public let processName: String?

        @inlinable
        public init(processName: String? = nil) {
            self.processName = processName
        }

        private enum CodingKeys: String, CodingKey {
            case processName = "ProcessName"
        }
    }

    public struct ProcessesType: AWSDecodableShape {
        /// The names of the process types.
        @OptionalCustomCoding<StandardArrayCoder<ProcessType>>
        public var processes: [ProcessType]?

        @inlinable
        public init(processes: [ProcessType]? = nil) {
            self.processes = processes
        }

        private enum CodingKeys: String, CodingKey {
            case processes = "Processes"
        }
    }

    public struct PutLifecycleHookAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct PutLifecycleHookType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The action the Auto Scaling group takes when the lifecycle hook timeout elapses or if an unexpected failure occurs. The default value is ABANDON. Valid values: CONTINUE | ABANDON
        public let defaultResult: String?
        /// The maximum time, in seconds, that can elapse before the lifecycle hook times out. The range is from 30 to 7200 seconds. The default value is 3600 seconds (1 hour).
        public let heartbeatTimeout: Int?
        /// The name of the lifecycle hook.
        public let lifecycleHookName: String?
        /// The lifecycle transition. For Auto Scaling groups, there are two major lifecycle transitions.   To create a lifecycle hook for scale-out events, specify autoscaling:EC2_INSTANCE_LAUNCHING.   To create a lifecycle hook for scale-in events, specify autoscaling:EC2_INSTANCE_TERMINATING.   Required for new lifecycle hooks, but optional when updating existing hooks.
        public let lifecycleTransition: String?
        /// Additional information that you want to include any time Amazon EC2 Auto Scaling sends a message to the notification target.
        public let notificationMetadata: String?
        /// The Amazon Resource Name (ARN) of the notification target that Amazon EC2 Auto Scaling uses to notify you when an instance is in a wait state for the lifecycle hook. You can specify either an Amazon SNS topic or an Amazon SQS queue. If you specify an empty string, this overrides the current ARN. This operation uses the JSON format when sending notifications to an Amazon SQS queue, and an email key-value pair format when sending notifications to an Amazon SNS topic. When you specify a notification target, Amazon EC2 Auto Scaling sends it a test message. Test messages contain the following additional key-value pair: "Event": "autoscaling:TEST_NOTIFICATION".
        public let notificationTargetARN: String?
        /// The ARN of the IAM role that allows the Auto Scaling group to publish to the specified notification target. Valid only if the notification target is an Amazon SNS topic or an Amazon SQS queue. Required for new lifecycle hooks, but optional when updating existing hooks.
        public let roleARN: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, defaultResult: String? = nil, heartbeatTimeout: Int? = nil, lifecycleHookName: String? = nil, lifecycleTransition: String? = nil, notificationMetadata: String? = nil, notificationTargetARN: String? = nil, roleARN: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.defaultResult = defaultResult
            self.heartbeatTimeout = heartbeatTimeout
            self.lifecycleHookName = lifecycleHookName
            self.lifecycleTransition = lifecycleTransition
            self.notificationMetadata = notificationMetadata
            self.notificationTargetARN = notificationTargetARN
            self.roleARN = roleARN
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, max: 255)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, min: 1)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
            try self.validate(self.notificationMetadata, name: "notificationMetadata", parent: name, max: 4000)
            try self.validate(self.notificationMetadata, name: "notificationMetadata", parent: name, min: 1)
            try self.validate(self.notificationMetadata, name: "notificationMetadata", parent: name, pattern: "^[\\u0009\\u000A\\u000D\\u0020-\\u007e]+$")
            try self.validate(self.notificationTargetARN, name: "notificationTargetARN", parent: name, max: 255)
            try self.validate(self.notificationTargetARN, name: "notificationTargetARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.roleARN, name: "roleARN", parent: name, max: 255)
            try self.validate(self.roleARN, name: "roleARN", parent: name, min: 1)
            try self.validate(self.roleARN, name: "roleARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case defaultResult = "DefaultResult"
            case heartbeatTimeout = "HeartbeatTimeout"
            case lifecycleHookName = "LifecycleHookName"
            case lifecycleTransition = "LifecycleTransition"
            case notificationMetadata = "NotificationMetadata"
            case notificationTargetARN = "NotificationTargetARN"
            case roleARN = "RoleARN"
        }
    }

    public struct PutNotificationConfigurationType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The type of event that causes the notification to be sent. To query the notification types supported by Amazon EC2 Auto Scaling, call the DescribeAutoScalingNotificationTypes API.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var notificationTypes: [String]?
        /// The Amazon Resource Name (ARN) of the Amazon SNS topic.
        public let topicARN: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, notificationTypes: [String]? = nil, topicARN: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.notificationTypes = notificationTypes
            self.topicARN = topicARN
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.notificationTypes?.forEach {
                try validate($0, name: "notificationTypes[]", parent: name, max: 255)
                try validate($0, name: "notificationTypes[]", parent: name, min: 1)
                try validate($0, name: "notificationTypes[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.topicARN, name: "topicARN", parent: name, max: 255)
            try self.validate(self.topicARN, name: "topicARN", parent: name, min: 1)
            try self.validate(self.topicARN, name: "topicARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case notificationTypes = "NotificationTypes"
            case topicARN = "TopicARN"
        }
    }

    public struct PutScalingPolicyType: AWSEncodableShape {
        /// Specifies how the scaling adjustment is interpreted (for example, an absolute number or a percentage). The valid values are ChangeInCapacity, ExactCapacity, and PercentChangeInCapacity. Required if the policy type is StepScaling or SimpleScaling. For more information, see Scaling adjustment types in the Amazon EC2 Auto Scaling User Guide.
        public let adjustmentType: String?
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// A cooldown period, in seconds, that applies to a specific simple scaling policy. When a cooldown period is specified here, it overrides the default cooldown. Valid only if the policy type is SimpleScaling. For more information, see Scaling cooldowns for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide. Default: None
        public let cooldown: Int?
        /// Indicates whether the scaling policy is enabled or disabled. The default is enabled. For more information, see Disable a scaling policy for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.
        public let enabled: Bool?
        ///  Not needed if the default instance warmup is defined for the group.  The estimated time, in seconds, until a newly launched instance can contribute to the CloudWatch metrics. This warm-up period applies to instances launched due to a specific target tracking or step scaling policy. When a warm-up period is specified here, it overrides the default instance warmup. Valid only if the policy type is TargetTrackingScaling or StepScaling.  The default is to use the value for the default instance warmup defined for the group. If default instance warmup is null, then EstimatedInstanceWarmup falls back to the value of default cooldown.
        public let estimatedInstanceWarmup: Int?
        /// The aggregation type for the CloudWatch metrics. The valid values are Minimum, Maximum, and Average. If the aggregation type is null, the value is treated as Average. Valid only if the policy type is StepScaling.
        public let metricAggregationType: String?
        /// The minimum value to scale by when the adjustment type is PercentChangeInCapacity. For example, suppose that you create a step scaling policy to scale out an Auto Scaling group by 25 percent and you specify a MinAdjustmentMagnitude of 2. If the group has 4 instances and the scaling policy is performed, 25 percent of 4 is 1. However, because you specified a MinAdjustmentMagnitude of 2, Amazon EC2 Auto Scaling scales out the group by 2 instances. Valid only if the policy type is StepScaling or SimpleScaling. For more information, see Scaling adjustment types in the Amazon EC2 Auto Scaling User Guide.  Some Auto Scaling groups use instance weights. In this case, set the MinAdjustmentMagnitude to a value that is at least as large as your largest instance weight.
        public let minAdjustmentMagnitude: Int?
        /// Available for backward compatibility. Use MinAdjustmentMagnitude instead.
        public let minAdjustmentStep: Int?
        /// The name of the policy.
        public let policyName: String?
        /// One of the following policy types:     TargetTrackingScaling     StepScaling     SimpleScaling (default)    PredictiveScaling
        public let policyType: String?
        /// A predictive scaling policy. Provides support for predefined and custom metrics. Predefined metrics include CPU utilization, network in/out, and the Application Load Balancer request count. For more information, see PredictiveScalingConfiguration in the Amazon EC2 Auto Scaling API Reference. Required if the policy type is PredictiveScaling.
        public let predictiveScalingConfiguration: PredictiveScalingConfiguration?
        /// The amount by which to scale, based on the specified adjustment type. A positive value adds to the current capacity while a negative number removes from the current capacity. For exact capacity, you must specify a non-negative value. Required if the policy type is SimpleScaling. (Not used with any other policy type.)
        public let scalingAdjustment: Int?
        /// A set of adjustments that enable you to scale based on the size of the alarm breach. Required if the policy type is StepScaling. (Not used with any other policy type.)
        @OptionalCustomCoding<StandardArrayCoder<StepAdjustment>>
        public var stepAdjustments: [StepAdjustment]?
        /// A target tracking scaling policy. Provides support for predefined or custom metrics. The following predefined metrics are available:    ASGAverageCPUUtilization     ASGAverageNetworkIn     ASGAverageNetworkOut     ALBRequestCountPerTarget    If you specify ALBRequestCountPerTarget for the metric, you must specify the ResourceLabel property with the PredefinedMetricSpecification. For more information, see TargetTrackingConfiguration in the Amazon EC2 Auto Scaling API Reference. Required if the policy type is TargetTrackingScaling.
        public let targetTrackingConfiguration: TargetTrackingConfiguration?

        @inlinable
        public init(adjustmentType: String? = nil, autoScalingGroupName: String? = nil, cooldown: Int? = nil, enabled: Bool? = nil, estimatedInstanceWarmup: Int? = nil, metricAggregationType: String? = nil, minAdjustmentMagnitude: Int? = nil, minAdjustmentStep: Int? = nil, policyName: String? = nil, policyType: String? = nil, predictiveScalingConfiguration: PredictiveScalingConfiguration? = nil, scalingAdjustment: Int? = nil, stepAdjustments: [StepAdjustment]? = nil, targetTrackingConfiguration: TargetTrackingConfiguration? = nil) {
            self.adjustmentType = adjustmentType
            self.autoScalingGroupName = autoScalingGroupName
            self.cooldown = cooldown
            self.enabled = enabled
            self.estimatedInstanceWarmup = estimatedInstanceWarmup
            self.metricAggregationType = metricAggregationType
            self.minAdjustmentMagnitude = minAdjustmentMagnitude
            self.minAdjustmentStep = minAdjustmentStep
            self.policyName = policyName
            self.policyType = policyType
            self.predictiveScalingConfiguration = predictiveScalingConfiguration
            self.scalingAdjustment = scalingAdjustment
            self.stepAdjustments = stepAdjustments
            self.targetTrackingConfiguration = targetTrackingConfiguration
        }

        public func validate(name: String) throws {
            try self.validate(self.adjustmentType, name: "adjustmentType", parent: name, max: 255)
            try self.validate(self.adjustmentType, name: "adjustmentType", parent: name, min: 1)
            try self.validate(self.adjustmentType, name: "adjustmentType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.metricAggregationType, name: "metricAggregationType", parent: name, max: 32)
            try self.validate(self.metricAggregationType, name: "metricAggregationType", parent: name, min: 1)
            try self.validate(self.metricAggregationType, name: "metricAggregationType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.policyName, name: "policyName", parent: name, max: 255)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.policyType, name: "policyType", parent: name, max: 64)
            try self.validate(self.policyType, name: "policyType", parent: name, min: 1)
            try self.validate(self.policyType, name: "policyType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.predictiveScalingConfiguration?.validate(name: "\(name).predictiveScalingConfiguration")
            try self.targetTrackingConfiguration?.validate(name: "\(name).targetTrackingConfiguration")
        }

        private enum CodingKeys: String, CodingKey {
            case adjustmentType = "AdjustmentType"
            case autoScalingGroupName = "AutoScalingGroupName"
            case cooldown = "Cooldown"
            case enabled = "Enabled"
            case estimatedInstanceWarmup = "EstimatedInstanceWarmup"
            case metricAggregationType = "MetricAggregationType"
            case minAdjustmentMagnitude = "MinAdjustmentMagnitude"
            case minAdjustmentStep = "MinAdjustmentStep"
            case policyName = "PolicyName"
            case policyType = "PolicyType"
            case predictiveScalingConfiguration = "PredictiveScalingConfiguration"
            case scalingAdjustment = "ScalingAdjustment"
            case stepAdjustments = "StepAdjustments"
            case targetTrackingConfiguration = "TargetTrackingConfiguration"
        }
    }

    public struct PutScheduledUpdateGroupActionType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The desired capacity is the initial capacity of the Auto Scaling group after the scheduled action runs and the capacity it attempts to maintain. It can scale beyond this capacity if you add more scaling conditions.   You must specify at least one of the following properties: MaxSize, MinSize, or DesiredCapacity.
        public let desiredCapacity: Int?
        /// The date and time for the recurring schedule to end, in UTC. For example, "2021-06-01T00:00:00Z".
        public let endTime: Date?
        /// The maximum size of the Auto Scaling group.
        public let maxSize: Int?
        /// The minimum size of the Auto Scaling group.
        public let minSize: Int?
        /// The recurring schedule for this action. This format consists of five fields separated by white spaces: [Minute] [Hour] [Day_of_Month] [Month_of_Year] [Day_of_Week]. The value must be in quotes (for example, "30 0 1 1,6,12 *"). For more information about this format, see Crontab. When StartTime and EndTime are specified with Recurrence, they form the boundaries of when the recurring action starts and stops. Cron expressions use Universal Coordinated Time (UTC) by default.
        public let recurrence: String?
        /// The name of this scaling action.
        public let scheduledActionName: String?
        /// The date and time for this action to start, in YYYY-MM-DDThh:mm:ssZ format in UTC/GMT only and in quotes (for example, "2021-06-01T00:00:00Z"). If you specify Recurrence and StartTime, Amazon EC2 Auto Scaling performs the action at this time, and then performs the action based on the specified recurrence.
        public let startTime: Date?
        /// This property is no longer used.
        public let time: Date?
        /// Specifies the time zone for a cron expression. If a time zone is not provided, UTC is used by default.  Valid values are the canonical names of the IANA time zones, derived from the IANA Time Zone Database (such as Etc/GMT+9 or Pacific/Tahiti). For more information, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.
        public let timeZone: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, desiredCapacity: Int? = nil, endTime: Date? = nil, maxSize: Int? = nil, minSize: Int? = nil, recurrence: String? = nil, scheduledActionName: String? = nil, startTime: Date? = nil, time: Date? = nil, timeZone: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.desiredCapacity = desiredCapacity
            self.endTime = endTime
            self.maxSize = maxSize
            self.minSize = minSize
            self.recurrence = recurrence
            self.scheduledActionName = scheduledActionName
            self.startTime = startTime
            self.time = time
            self.timeZone = timeZone
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.recurrence, name: "recurrence", parent: name, max: 255)
            try self.validate(self.recurrence, name: "recurrence", parent: name, min: 1)
            try self.validate(self.recurrence, name: "recurrence", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, max: 255)
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, min: 1)
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.timeZone, name: "timeZone", parent: name, max: 255)
            try self.validate(self.timeZone, name: "timeZone", parent: name, min: 1)
            try self.validate(self.timeZone, name: "timeZone", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case desiredCapacity = "DesiredCapacity"
            case endTime = "EndTime"
            case maxSize = "MaxSize"
            case minSize = "MinSize"
            case recurrence = "Recurrence"
            case scheduledActionName = "ScheduledActionName"
            case startTime = "StartTime"
            case time = "Time"
            case timeZone = "TimeZone"
        }
    }

    public struct PutWarmPoolAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct PutWarmPoolType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// Indicates whether instances in the Auto Scaling group can be returned to the warm pool on scale in. The default is to terminate instances in the Auto Scaling group when the group scales in.
        public let instanceReusePolicy: InstanceReusePolicy?
        /// Specifies the maximum number of instances that are allowed to be in the warm pool or in any state except Terminated for the Auto Scaling group. This is an optional property. Specify it only if you do not want the warm pool size to be determined by the difference between the group's maximum capacity and its desired capacity.   If a value for MaxGroupPreparedCapacity is not specified, Amazon EC2 Auto Scaling launches and maintains the difference between the group's maximum capacity and its desired capacity. If you specify a value for MaxGroupPreparedCapacity, Amazon EC2 Auto Scaling uses the difference between the MaxGroupPreparedCapacity and the desired capacity instead.  The size of the warm pool is dynamic. Only when MaxGroupPreparedCapacity and MinSize are set to the same value does the warm pool have an absolute size.  If the desired capacity of the Auto Scaling group is higher than the MaxGroupPreparedCapacity, the capacity of the warm pool is 0, unless you specify a value for MinSize. To remove a value that you previously set, include the property but specify -1 for the value.
        public let maxGroupPreparedCapacity: Int?
        /// Specifies the minimum number of instances to maintain in the warm pool. This helps you to ensure that there is always a certain number of warmed instances available to handle traffic spikes. Defaults to 0 if not specified.
        public let minSize: Int?
        /// Sets the instance state to transition to after the lifecycle actions are complete. Default is Stopped.
        public let poolState: WarmPoolState?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceReusePolicy: InstanceReusePolicy? = nil, maxGroupPreparedCapacity: Int? = nil, minSize: Int? = nil, poolState: WarmPoolState? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceReusePolicy = instanceReusePolicy
            self.maxGroupPreparedCapacity = maxGroupPreparedCapacity
            self.minSize = minSize
            self.poolState = poolState
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.maxGroupPreparedCapacity, name: "maxGroupPreparedCapacity", parent: name, min: -1)
            try self.validate(self.minSize, name: "minSize", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceReusePolicy = "InstanceReusePolicy"
            case maxGroupPreparedCapacity = "MaxGroupPreparedCapacity"
            case minSize = "MinSize"
            case poolState = "PoolState"
        }
    }

    public struct RecordLifecycleActionHeartbeatAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct RecordLifecycleActionHeartbeatType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The ID of the instance.
        public let instanceId: String?
        /// A token that uniquely identifies a specific lifecycle action associated with an instance. Amazon EC2 Auto Scaling sends this token to the notification target that you specified when you created the lifecycle hook.
        public let lifecycleActionToken: String?
        /// The name of the lifecycle hook.
        public let lifecycleHookName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceId: String? = nil, lifecycleActionToken: String? = nil, lifecycleHookName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceId = instanceId
            self.lifecycleActionToken = lifecycleActionToken
            self.lifecycleHookName = lifecycleHookName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 1600)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 19)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.lifecycleActionToken, name: "lifecycleActionToken", parent: name, max: 36)
            try self.validate(self.lifecycleActionToken, name: "lifecycleActionToken", parent: name, min: 36)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, max: 255)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, min: 1)
            try self.validate(self.lifecycleHookName, name: "lifecycleHookName", parent: name, pattern: "^[A-Za-z0-9\\-_\\/]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceId = "InstanceId"
            case lifecycleActionToken = "LifecycleActionToken"
            case lifecycleHookName = "LifecycleHookName"
        }
    }

    public struct RefreshPreferences: AWSEncodableShape & AWSDecodableShape {
        /// (Optional) The CloudWatch alarm specification. CloudWatch alarms can be used to identify any issues and fail the operation if an alarm threshold is met.
        public let alarmSpecification: AlarmSpecification?
        /// (Optional) Indicates whether to roll back the Auto Scaling group to its previous configuration if the instance refresh fails or a CloudWatch alarm threshold is met. The default is false. A rollback is not supported in the following situations:    There is no desired configuration specified for the instance refresh.   The Auto Scaling group has a launch template that uses an Amazon Web Services Systems Manager parameter instead of an AMI ID for the ImageId property.   The Auto Scaling group uses the launch template's $Latest or $Default version.   For more information, see Undo changes with a rollback in the Amazon EC2 Auto Scaling User Guide.
        public let autoRollback: Bool?
        ///  The amount of time, in seconds, to wait at the end of an instance refresh before the instance refresh is considered complete.
        public let bakeTime: Int?
        /// (Optional) The amount of time, in seconds, to wait after a checkpoint before continuing. This property is optional, but if you specify a value for it, you must also specify a value for CheckpointPercentages. If you specify a value for CheckpointPercentages and not for CheckpointDelay, the CheckpointDelay defaults to 3600 (1 hour).
        public let checkpointDelay: Int?
        /// (Optional) Threshold values for each checkpoint in ascending order. Each number must be unique. To replace all instances in the Auto Scaling group, the last number in the array must be 100. For usage examples, see Add checkpoints to an instance refresh in the Amazon EC2 Auto Scaling User Guide.
        @OptionalCustomCoding<StandardArrayCoder<Int>>
        public var checkpointPercentages: [Int]?
        /// A time period, in seconds, during which an instance refresh waits before moving on to replacing the next instance after a new instance enters the InService state. This property is not required for normal usage. Instead, use the DefaultInstanceWarmup property of the Auto Scaling group. The InstanceWarmup and DefaultInstanceWarmup properties work the same way. Only specify this property if you must override the DefaultInstanceWarmup property.  If you do not specify this property, the instance warmup by default is the value of the DefaultInstanceWarmup property, if defined (which is recommended in all cases), or the HealthCheckGracePeriod property otherwise.
        public let instanceWarmup: Int?
        /// Specifies the maximum percentage of the group that can be in service and healthy, or pending, to support your workload when replacing instances. The value is expressed as a percentage of the desired capacity of the Auto Scaling group. Value range is 100 to 200. If you specify MaxHealthyPercentage, you must also specify MinHealthyPercentage, and the difference between them cannot be greater than 100. A larger range increases the number of instances that can be replaced at the same time. If you do not specify this property, the default is 100 percent, or the percentage set in the instance maintenance policy for the Auto Scaling group, if defined.
        public let maxHealthyPercentage: Int?
        /// Specifies the minimum percentage of the group to keep in service, healthy, and ready to use to support your workload to allow the operation to continue. The value is expressed as a percentage of the desired capacity of the Auto Scaling group. Value range is 0 to 100. If you do not specify this property, the default is 90 percent, or the percentage set in the instance maintenance policy for the Auto Scaling group, if defined.
        public let minHealthyPercentage: Int?
        /// Choose the behavior that you want Amazon EC2 Auto Scaling to use if instances protected from scale in are found.  The following lists the valid values:  Refresh  Amazon EC2 Auto Scaling replaces instances that are protected from scale in.  Ignore  Amazon EC2 Auto Scaling ignores instances that are protected from scale in and continues to replace instances that are not protected.  Wait (default)  Amazon EC2 Auto Scaling waits one hour for you to remove scale-in protection. Otherwise, the instance refresh will fail.
        public let scaleInProtectedInstances: ScaleInProtectedInstances?
        /// (Optional) Indicates whether skip matching is enabled. If enabled (true), then Amazon EC2 Auto Scaling skips replacing instances that match the desired configuration. If no desired configuration is specified, then it skips replacing instances that have the same launch template and instance types that the Auto Scaling group was using before the start of the instance refresh. The default is false. For more information, see Use an instance refresh with skip matching in the Amazon EC2 Auto Scaling User Guide.
        public let skipMatching: Bool?
        /// Choose the behavior that you want Amazon EC2 Auto Scaling to use if instances in Standby state are found. The following lists the valid values:  Terminate  Amazon EC2 Auto Scaling terminates instances that are in Standby.  Ignore  Amazon EC2 Auto Scaling ignores instances that are in Standby and continues to replace instances that are in the InService state.  Wait (default)  Amazon EC2 Auto Scaling waits one hour for you to return the instances to service. Otherwise, the instance refresh will fail.
        public let standbyInstances: StandbyInstances?

        @inlinable
        public init(alarmSpecification: AlarmSpecification? = nil, autoRollback: Bool? = nil, bakeTime: Int? = nil, checkpointDelay: Int? = nil, checkpointPercentages: [Int]? = nil, instanceWarmup: Int? = nil, maxHealthyPercentage: Int? = nil, minHealthyPercentage: Int? = nil, scaleInProtectedInstances: ScaleInProtectedInstances? = nil, skipMatching: Bool? = nil, standbyInstances: StandbyInstances? = nil) {
            self.alarmSpecification = alarmSpecification
            self.autoRollback = autoRollback
            self.bakeTime = bakeTime
            self.checkpointDelay = checkpointDelay
            self.checkpointPercentages = checkpointPercentages
            self.instanceWarmup = instanceWarmup
            self.maxHealthyPercentage = maxHealthyPercentage
            self.minHealthyPercentage = minHealthyPercentage
            self.scaleInProtectedInstances = scaleInProtectedInstances
            self.skipMatching = skipMatching
            self.standbyInstances = standbyInstances
        }

        public func validate(name: String) throws {
            try self.alarmSpecification?.validate(name: "\(name).alarmSpecification")
            try self.validate(self.bakeTime, name: "bakeTime", parent: name, max: 172800)
            try self.validate(self.bakeTime, name: "bakeTime", parent: name, min: 0)
            try self.validate(self.checkpointDelay, name: "checkpointDelay", parent: name, max: 172800)
            try self.validate(self.checkpointDelay, name: "checkpointDelay", parent: name, min: 0)
            try self.checkpointPercentages?.forEach {
                try validate($0, name: "checkpointPercentages[]", parent: name, max: 100)
                try validate($0, name: "checkpointPercentages[]", parent: name, min: 1)
            }
            try self.validate(self.instanceWarmup, name: "instanceWarmup", parent: name, min: 0)
            try self.validate(self.maxHealthyPercentage, name: "maxHealthyPercentage", parent: name, max: 200)
            try self.validate(self.maxHealthyPercentage, name: "maxHealthyPercentage", parent: name, min: 100)
            try self.validate(self.minHealthyPercentage, name: "minHealthyPercentage", parent: name, max: 100)
            try self.validate(self.minHealthyPercentage, name: "minHealthyPercentage", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case alarmSpecification = "AlarmSpecification"
            case autoRollback = "AutoRollback"
            case bakeTime = "BakeTime"
            case checkpointDelay = "CheckpointDelay"
            case checkpointPercentages = "CheckpointPercentages"
            case instanceWarmup = "InstanceWarmup"
            case maxHealthyPercentage = "MaxHealthyPercentage"
            case minHealthyPercentage = "MinHealthyPercentage"
            case scaleInProtectedInstances = "ScaleInProtectedInstances"
            case skipMatching = "SkipMatching"
            case standbyInstances = "StandbyInstances"
        }
    }

    public struct RollbackDetails: AWSDecodableShape {
        /// Indicates the value of InstancesToUpdate at the time the rollback started.
        public let instancesToUpdateOnRollback: Int?
        /// Indicates the value of PercentageComplete at the time the rollback started.
        public let percentageCompleteOnRollback: Int?
        /// Reports progress on replacing instances in an Auto Scaling group that has a warm pool. This includes separate details for instances in the warm pool and instances in the Auto Scaling group (the live pool).
        public let progressDetailsOnRollback: InstanceRefreshProgressDetails?
        /// The reason for this instance refresh rollback (for example, whether a manual or automatic rollback was initiated).
        public let rollbackReason: String?
        /// The date and time at which the rollback began.
        public let rollbackStartTime: Date?

        @inlinable
        public init(instancesToUpdateOnRollback: Int? = nil, percentageCompleteOnRollback: Int? = nil, progressDetailsOnRollback: InstanceRefreshProgressDetails? = nil, rollbackReason: String? = nil, rollbackStartTime: Date? = nil) {
            self.instancesToUpdateOnRollback = instancesToUpdateOnRollback
            self.percentageCompleteOnRollback = percentageCompleteOnRollback
            self.progressDetailsOnRollback = progressDetailsOnRollback
            self.rollbackReason = rollbackReason
            self.rollbackStartTime = rollbackStartTime
        }

        private enum CodingKeys: String, CodingKey {
            case instancesToUpdateOnRollback = "InstancesToUpdateOnRollback"
            case percentageCompleteOnRollback = "PercentageCompleteOnRollback"
            case progressDetailsOnRollback = "ProgressDetailsOnRollback"
            case rollbackReason = "RollbackReason"
            case rollbackStartTime = "RollbackStartTime"
        }
    }

    public struct RollbackInstanceRefreshAnswer: AWSDecodableShape {
        /// The instance refresh ID associated with the request. This is the unique ID assigned to the instance refresh when it was started.
        public let instanceRefreshId: String?

        @inlinable
        public init(instanceRefreshId: String? = nil) {
            self.instanceRefreshId = instanceRefreshId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceRefreshId = "InstanceRefreshId"
        }
    }

    public struct RollbackInstanceRefreshType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
        }
    }

    public struct ScalingPolicy: AWSDecodableShape {
        /// Specifies how the scaling adjustment is interpreted (for example, an absolute number or a percentage). The valid values are ChangeInCapacity, ExactCapacity, and PercentChangeInCapacity.
        public let adjustmentType: String?
        /// The CloudWatch alarms related to the policy.
        @OptionalCustomCoding<StandardArrayCoder<Alarm>>
        public var alarms: [Alarm]?
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The duration of the policy's cooldown period, in seconds.
        public let cooldown: Int?
        /// Indicates whether the policy is enabled (true) or disabled (false).
        public let enabled: Bool?
        /// The estimated time, in seconds, until a newly launched instance can contribute to the CloudWatch metrics.
        public let estimatedInstanceWarmup: Int?
        /// The aggregation type for the CloudWatch metrics. The valid values are Minimum, Maximum, and Average.
        public let metricAggregationType: String?
        /// The minimum value to scale by when the adjustment type is PercentChangeInCapacity.
        public let minAdjustmentMagnitude: Int?
        /// Available for backward compatibility. Use MinAdjustmentMagnitude instead.
        public let minAdjustmentStep: Int?
        /// The Amazon Resource Name (ARN) of the policy.
        public let policyARN: String?
        /// The name of the scaling policy.
        public let policyName: String?
        /// One of the following policy types:     TargetTrackingScaling     StepScaling     SimpleScaling (default)    PredictiveScaling    For more information, see Target tracking scaling policies and Step and simple scaling policies in the Amazon EC2 Auto Scaling User Guide.
        public let policyType: String?
        /// A predictive scaling policy.
        public let predictiveScalingConfiguration: PredictiveScalingConfiguration?
        /// The amount by which to scale, based on the specified adjustment type. A positive value adds to the current capacity while a negative number removes from the current capacity.
        public let scalingAdjustment: Int?
        /// A set of adjustments that enable you to scale based on the size of the alarm breach.
        @OptionalCustomCoding<StandardArrayCoder<StepAdjustment>>
        public var stepAdjustments: [StepAdjustment]?
        /// A target tracking scaling policy.
        public let targetTrackingConfiguration: TargetTrackingConfiguration?

        @inlinable
        public init(adjustmentType: String? = nil, alarms: [Alarm]? = nil, autoScalingGroupName: String? = nil, cooldown: Int? = nil, enabled: Bool? = nil, estimatedInstanceWarmup: Int? = nil, metricAggregationType: String? = nil, minAdjustmentMagnitude: Int? = nil, minAdjustmentStep: Int? = nil, policyARN: String? = nil, policyName: String? = nil, policyType: String? = nil, predictiveScalingConfiguration: PredictiveScalingConfiguration? = nil, scalingAdjustment: Int? = nil, stepAdjustments: [StepAdjustment]? = nil, targetTrackingConfiguration: TargetTrackingConfiguration? = nil) {
            self.adjustmentType = adjustmentType
            self.alarms = alarms
            self.autoScalingGroupName = autoScalingGroupName
            self.cooldown = cooldown
            self.enabled = enabled
            self.estimatedInstanceWarmup = estimatedInstanceWarmup
            self.metricAggregationType = metricAggregationType
            self.minAdjustmentMagnitude = minAdjustmentMagnitude
            self.minAdjustmentStep = minAdjustmentStep
            self.policyARN = policyARN
            self.policyName = policyName
            self.policyType = policyType
            self.predictiveScalingConfiguration = predictiveScalingConfiguration
            self.scalingAdjustment = scalingAdjustment
            self.stepAdjustments = stepAdjustments
            self.targetTrackingConfiguration = targetTrackingConfiguration
        }

        private enum CodingKeys: String, CodingKey {
            case adjustmentType = "AdjustmentType"
            case alarms = "Alarms"
            case autoScalingGroupName = "AutoScalingGroupName"
            case cooldown = "Cooldown"
            case enabled = "Enabled"
            case estimatedInstanceWarmup = "EstimatedInstanceWarmup"
            case metricAggregationType = "MetricAggregationType"
            case minAdjustmentMagnitude = "MinAdjustmentMagnitude"
            case minAdjustmentStep = "MinAdjustmentStep"
            case policyARN = "PolicyARN"
            case policyName = "PolicyName"
            case policyType = "PolicyType"
            case predictiveScalingConfiguration = "PredictiveScalingConfiguration"
            case scalingAdjustment = "ScalingAdjustment"
            case stepAdjustments = "StepAdjustments"
            case targetTrackingConfiguration = "TargetTrackingConfiguration"
        }
    }

    public struct ScalingProcessQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// One or more of the following processes:    Launch     Terminate     AddToLoadBalancer     AlarmNotification     AZRebalance     HealthCheck     InstanceRefresh     ReplaceUnhealthy     ScheduledActions    If you omit this property, all processes are specified.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var scalingProcesses: [String]?

        @inlinable
        public init(autoScalingGroupName: String? = nil, scalingProcesses: [String]? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.scalingProcesses = scalingProcesses
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.scalingProcesses?.forEach {
                try validate($0, name: "scalingProcesses[]", parent: name, max: 255)
                try validate($0, name: "scalingProcesses[]", parent: name, min: 1)
                try validate($0, name: "scalingProcesses[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case scalingProcesses = "ScalingProcesses"
        }
    }

    public struct ScheduledActionsType: AWSDecodableShape {
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?
        /// The scheduled actions.
        @OptionalCustomCoding<StandardArrayCoder<ScheduledUpdateGroupAction>>
        public var scheduledUpdateGroupActions: [ScheduledUpdateGroupAction]?

        @inlinable
        public init(nextToken: String? = nil, scheduledUpdateGroupActions: [ScheduledUpdateGroupAction]? = nil) {
            self.nextToken = nextToken
            self.scheduledUpdateGroupActions = scheduledUpdateGroupActions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case scheduledUpdateGroupActions = "ScheduledUpdateGroupActions"
        }
    }

    public struct ScheduledUpdateGroupAction: AWSDecodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The desired capacity is the initial capacity of the Auto Scaling group after the scheduled action runs and the capacity it attempts to maintain.
        public let desiredCapacity: Int?
        /// The date and time in UTC for the recurring schedule to end. For example, "2019-06-01T00:00:00Z".
        public let endTime: Date?
        /// The maximum size of the Auto Scaling group.
        public let maxSize: Int?
        /// The minimum size of the Auto Scaling group.
        public let minSize: Int?
        /// The recurring schedule for the action, in Unix cron syntax format. When StartTime and EndTime are specified with Recurrence, they form the boundaries of when the recurring action starts and stops.
        public let recurrence: String?
        /// The Amazon Resource Name (ARN) of the scheduled action.
        public let scheduledActionARN: String?
        /// The name of the scheduled action.
        public let scheduledActionName: String?
        /// The date and time in UTC for this action to start. For example, "2019-06-01T00:00:00Z".
        public let startTime: Date?
        /// This property is no longer used.
        public let time: Date?
        /// The time zone for the cron expression.
        public let timeZone: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, desiredCapacity: Int? = nil, endTime: Date? = nil, maxSize: Int? = nil, minSize: Int? = nil, recurrence: String? = nil, scheduledActionARN: String? = nil, scheduledActionName: String? = nil, startTime: Date? = nil, time: Date? = nil, timeZone: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.desiredCapacity = desiredCapacity
            self.endTime = endTime
            self.maxSize = maxSize
            self.minSize = minSize
            self.recurrence = recurrence
            self.scheduledActionARN = scheduledActionARN
            self.scheduledActionName = scheduledActionName
            self.startTime = startTime
            self.time = time
            self.timeZone = timeZone
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case desiredCapacity = "DesiredCapacity"
            case endTime = "EndTime"
            case maxSize = "MaxSize"
            case minSize = "MinSize"
            case recurrence = "Recurrence"
            case scheduledActionARN = "ScheduledActionARN"
            case scheduledActionName = "ScheduledActionName"
            case startTime = "StartTime"
            case time = "Time"
            case timeZone = "TimeZone"
        }
    }

    public struct ScheduledUpdateGroupActionRequest: AWSEncodableShape {
        /// The desired capacity is the initial capacity of the Auto Scaling group after the scheduled action runs and the capacity it attempts to maintain.
        public let desiredCapacity: Int?
        /// The date and time for the recurring schedule to end, in UTC.
        public let endTime: Date?
        /// The maximum size of the Auto Scaling group.
        public let maxSize: Int?
        /// The minimum size of the Auto Scaling group.
        public let minSize: Int?
        /// The recurring schedule for the action, in Unix cron syntax format. This format consists of five fields separated by white spaces: [Minute] [Hour] [Day_of_Month] [Month_of_Year] [Day_of_Week]. The value must be in quotes (for example, "30 0 1 1,6,12 *"). For more information about this format, see Crontab. When StartTime and EndTime are specified with Recurrence, they form the boundaries of when the recurring action starts and stops. Cron expressions use Universal Coordinated Time (UTC) by default.
        public let recurrence: String?
        /// The name of the scaling action.
        public let scheduledActionName: String?
        /// The date and time for the action to start, in YYYY-MM-DDThh:mm:ssZ format in UTC/GMT only and in quotes (for example, "2019-06-01T00:00:00Z"). If you specify Recurrence and StartTime, Amazon EC2 Auto Scaling performs the action at this time, and then performs the action based on the specified recurrence. If you try to schedule the action in the past, Amazon EC2 Auto Scaling returns an error message.
        public let startTime: Date?
        /// Specifies the time zone for a cron expression. If a time zone is not provided, UTC is used by default.  Valid values are the canonical names of the IANA time zones, derived from the IANA Time Zone Database (such as Etc/GMT+9 or Pacific/Tahiti). For more information, see https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.
        public let timeZone: String?

        @inlinable
        public init(desiredCapacity: Int? = nil, endTime: Date? = nil, maxSize: Int? = nil, minSize: Int? = nil, recurrence: String? = nil, scheduledActionName: String? = nil, startTime: Date? = nil, timeZone: String? = nil) {
            self.desiredCapacity = desiredCapacity
            self.endTime = endTime
            self.maxSize = maxSize
            self.minSize = minSize
            self.recurrence = recurrence
            self.scheduledActionName = scheduledActionName
            self.startTime = startTime
            self.timeZone = timeZone
        }

        public func validate(name: String) throws {
            try self.validate(self.recurrence, name: "recurrence", parent: name, max: 255)
            try self.validate(self.recurrence, name: "recurrence", parent: name, min: 1)
            try self.validate(self.recurrence, name: "recurrence", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, max: 255)
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, min: 1)
            try self.validate(self.scheduledActionName, name: "scheduledActionName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.timeZone, name: "timeZone", parent: name, max: 255)
            try self.validate(self.timeZone, name: "timeZone", parent: name, min: 1)
            try self.validate(self.timeZone, name: "timeZone", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case desiredCapacity = "DesiredCapacity"
            case endTime = "EndTime"
            case maxSize = "MaxSize"
            case minSize = "MinSize"
            case recurrence = "Recurrence"
            case scheduledActionName = "ScheduledActionName"
            case startTime = "StartTime"
            case timeZone = "TimeZone"
        }
    }

    public struct SetDesiredCapacityType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The desired capacity is the initial capacity of the Auto Scaling group after this operation completes and the capacity it attempts to maintain.
        public let desiredCapacity: Int?
        /// Indicates whether Amazon EC2 Auto Scaling waits for the cooldown period to complete before initiating a scaling activity to set your Auto Scaling group to its new capacity. By default, Amazon EC2 Auto Scaling does not honor the cooldown period during manual scaling activities.
        public let honorCooldown: Bool?

        @inlinable
        public init(autoScalingGroupName: String? = nil, desiredCapacity: Int? = nil, honorCooldown: Bool? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.desiredCapacity = desiredCapacity
            self.honorCooldown = honorCooldown
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case desiredCapacity = "DesiredCapacity"
            case honorCooldown = "HonorCooldown"
        }
    }

    public struct SetInstanceHealthQuery: AWSEncodableShape {
        /// The health status of the instance. Set to Healthy to have the instance remain in service. Set to Unhealthy to have the instance be out of service. Amazon EC2 Auto Scaling terminates and replaces the unhealthy instance.
        public let healthStatus: String?
        /// The ID of the instance.
        public let instanceId: String?
        /// If the Auto Scaling group of the specified instance has a HealthCheckGracePeriod specified for the group, by default, this call respects the grace period. Set this to False, to have the call not respect the grace period associated with the group. For more information about the health check grace period, see Set the health check grace period for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.
        public let shouldRespectGracePeriod: Bool?

        @inlinable
        public init(healthStatus: String? = nil, instanceId: String? = nil, shouldRespectGracePeriod: Bool? = nil) {
            self.healthStatus = healthStatus
            self.instanceId = instanceId
            self.shouldRespectGracePeriod = shouldRespectGracePeriod
        }

        public func validate(name: String) throws {
            try self.validate(self.healthStatus, name: "healthStatus", parent: name, max: 32)
            try self.validate(self.healthStatus, name: "healthStatus", parent: name, min: 1)
            try self.validate(self.healthStatus, name: "healthStatus", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 19)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case healthStatus = "HealthStatus"
            case instanceId = "InstanceId"
            case shouldRespectGracePeriod = "ShouldRespectGracePeriod"
        }
    }

    public struct SetInstanceProtectionAnswer: AWSDecodableShape {
        public init() {}
    }

    public struct SetInstanceProtectionQuery: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// One or more instance IDs. You can specify up to 50 instances.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var instanceIds: [String]?
        /// Indicates whether the instance is protected from termination by Amazon EC2 Auto Scaling when scaling in.
        public let protectedFromScaleIn: Bool?

        @inlinable
        public init(autoScalingGroupName: String? = nil, instanceIds: [String]? = nil, protectedFromScaleIn: Bool? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.instanceIds = instanceIds
            self.protectedFromScaleIn = protectedFromScaleIn
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceIds?.forEach {
                try validate($0, name: "instanceIds[]", parent: name, max: 19)
                try validate($0, name: "instanceIds[]", parent: name, min: 1)
                try validate($0, name: "instanceIds[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case instanceIds = "InstanceIds"
            case protectedFromScaleIn = "ProtectedFromScaleIn"
        }
    }

    public struct StartInstanceRefreshAnswer: AWSDecodableShape {
        /// A unique ID for tracking the progress of the instance refresh.
        public let instanceRefreshId: String?

        @inlinable
        public init(instanceRefreshId: String? = nil) {
            self.instanceRefreshId = instanceRefreshId
        }

        private enum CodingKeys: String, CodingKey {
            case instanceRefreshId = "InstanceRefreshId"
        }
    }

    public struct StartInstanceRefreshType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        /// The desired configuration. For example, the desired configuration can specify a new launch template or a new version of the current launch template. Once the instance refresh succeeds, Amazon EC2 Auto Scaling updates the settings of the Auto Scaling group to reflect the new desired configuration.   When you specify a new launch template or a new version of the current launch template for your desired configuration, consider enabling the SkipMatching property in preferences. If it's enabled, Amazon EC2 Auto Scaling skips replacing instances that already use the specified launch template and instance types. This can help you reduce the number of replacements that are required to apply updates.
        public let desiredConfiguration: DesiredConfiguration?
        /// Sets your preferences for the instance refresh so that it performs as expected when you start it. Includes the instance warmup time, the minimum and maximum healthy percentages, and the behaviors that you want Amazon EC2 Auto Scaling to use if instances that are in Standby state or protected from scale in are found. You can also choose to enable additional features, such as the following:   Auto rollback   Checkpoints   CloudWatch alarms   Skip matching   Bake time
        public let preferences: RefreshPreferences?
        /// The strategy to use for the instance refresh. The only valid value is Rolling.
        public let strategy: RefreshStrategy?

        @inlinable
        public init(autoScalingGroupName: String? = nil, desiredConfiguration: DesiredConfiguration? = nil, preferences: RefreshPreferences? = nil, strategy: RefreshStrategy? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.desiredConfiguration = desiredConfiguration
            self.preferences = preferences
            self.strategy = strategy
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.desiredConfiguration?.validate(name: "\(name).desiredConfiguration")
            try self.preferences?.validate(name: "\(name).preferences")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case desiredConfiguration = "DesiredConfiguration"
            case preferences = "Preferences"
            case strategy = "Strategy"
        }
    }

    public struct StepAdjustment: AWSEncodableShape & AWSDecodableShape {
        /// The lower bound for the difference between the alarm threshold and the CloudWatch metric. If the metric value is above the breach threshold, the lower bound is inclusive (the metric must be greater than or equal to the threshold plus the lower bound). Otherwise, it is exclusive (the metric must be greater than the threshold plus the lower bound). A null value indicates negative infinity.
        public let metricIntervalLowerBound: Double?
        /// The upper bound for the difference between the alarm threshold and the CloudWatch metric. If the metric value is above the breach threshold, the upper bound is exclusive (the metric must be less than the threshold plus the upper bound). Otherwise, it is inclusive (the metric must be less than or equal to the threshold plus the upper bound). A null value indicates positive infinity. The upper bound must be greater than the lower bound.
        public let metricIntervalUpperBound: Double?
        /// The amount by which to scale, based on the specified adjustment type. A positive value adds to the current capacity while a negative number removes from the current capacity. For exact capacity, you must specify a non-negative value.
        public let scalingAdjustment: Int?

        @inlinable
        public init(metricIntervalLowerBound: Double? = nil, metricIntervalUpperBound: Double? = nil, scalingAdjustment: Int? = nil) {
            self.metricIntervalLowerBound = metricIntervalLowerBound
            self.metricIntervalUpperBound = metricIntervalUpperBound
            self.scalingAdjustment = scalingAdjustment
        }

        private enum CodingKeys: String, CodingKey {
            case metricIntervalLowerBound = "MetricIntervalLowerBound"
            case metricIntervalUpperBound = "MetricIntervalUpperBound"
            case scalingAdjustment = "ScalingAdjustment"
        }
    }

    public struct SuspendedProcess: AWSDecodableShape {
        /// The name of the suspended process.
        public let processName: String?
        /// The reason that the process was suspended.
        public let suspensionReason: String?

        @inlinable
        public init(processName: String? = nil, suspensionReason: String? = nil) {
            self.processName = processName
            self.suspensionReason = suspensionReason
        }

        private enum CodingKeys: String, CodingKey {
            case processName = "ProcessName"
            case suspensionReason = "SuspensionReason"
        }
    }

    public struct Tag: AWSEncodableShape {
        /// The tag key.
        public let key: String?
        /// Determines whether the tag is added to new instances as they are launched in the group.
        public let propagateAtLaunch: Bool?
        /// The name of the Auto Scaling group.
        public let resourceId: String?
        /// The type of resource. The only supported value is auto-scaling-group.
        public let resourceType: String?
        /// The tag value.
        public let value: String?

        @inlinable
        public init(key: String? = nil, propagateAtLaunch: Bool? = nil, resourceId: String? = nil, resourceType: String? = nil, value: String? = nil) {
            self.key = key
            self.propagateAtLaunch = propagateAtLaunch
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.key, name: "key", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.resourceId, name: "resourceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.resourceType, name: "resourceType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.value, name: "value", parent: name, max: 256)
            try self.validate(self.value, name: "value", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case propagateAtLaunch = "PropagateAtLaunch"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case value = "Value"
        }
    }

    public struct TagDescription: AWSDecodableShape {
        /// The tag key.
        public let key: String?
        /// Determines whether the tag is added to new instances as they are launched in the group.
        public let propagateAtLaunch: Bool?
        /// The name of the group.
        public let resourceId: String?
        /// The type of resource. The only supported value is auto-scaling-group.
        public let resourceType: String?
        /// The tag value.
        public let value: String?

        @inlinable
        public init(key: String? = nil, propagateAtLaunch: Bool? = nil, resourceId: String? = nil, resourceType: String? = nil, value: String? = nil) {
            self.key = key
            self.propagateAtLaunch = propagateAtLaunch
            self.resourceId = resourceId
            self.resourceType = resourceType
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case propagateAtLaunch = "PropagateAtLaunch"
            case resourceId = "ResourceId"
            case resourceType = "ResourceType"
            case value = "Value"
        }
    }

    public struct TagsType: AWSDecodableShape {
        /// A string that indicates that the response contains more items than can be returned in a single response. To receive additional items, specify this string for the NextToken value when requesting the next set of items. This value is null when there are no more items to return.
        public let nextToken: String?
        /// One or more tags.
        @OptionalCustomCoding<StandardArrayCoder<TagDescription>>
        public var tags: [TagDescription]?

        @inlinable
        public init(nextToken: String? = nil, tags: [TagDescription]? = nil) {
            self.nextToken = nextToken
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case tags = "Tags"
        }
    }

    public struct TargetTrackingConfiguration: AWSEncodableShape & AWSDecodableShape {
        /// A customized metric. You must specify either a predefined metric or a customized metric.
        public let customizedMetricSpecification: CustomizedMetricSpecification?
        /// Indicates whether scaling in by the target tracking scaling policy is disabled. If scaling in is disabled, the target tracking scaling policy doesn't remove instances from the Auto Scaling group. Otherwise, the target tracking scaling policy can remove instances from the Auto Scaling group. The default is false.
        public let disableScaleIn: Bool?
        /// A predefined metric. You must specify either a predefined metric or a customized metric.
        public let predefinedMetricSpecification: PredefinedMetricSpecification?
        /// The target value for the metric.  Some metrics are based on a count instead of a percentage, such as the request count for an Application Load Balancer or the number of messages in an SQS queue. If the scaling policy specifies one of these metrics, specify the target utilization as the optimal average request or message count per instance during any one-minute interval.
        public let targetValue: Double?

        @inlinable
        public init(customizedMetricSpecification: CustomizedMetricSpecification? = nil, disableScaleIn: Bool? = nil, predefinedMetricSpecification: PredefinedMetricSpecification? = nil, targetValue: Double? = nil) {
            self.customizedMetricSpecification = customizedMetricSpecification
            self.disableScaleIn = disableScaleIn
            self.predefinedMetricSpecification = predefinedMetricSpecification
            self.targetValue = targetValue
        }

        public func validate(name: String) throws {
            try self.customizedMetricSpecification?.validate(name: "\(name).customizedMetricSpecification")
            try self.predefinedMetricSpecification?.validate(name: "\(name).predefinedMetricSpecification")
        }

        private enum CodingKeys: String, CodingKey {
            case customizedMetricSpecification = "CustomizedMetricSpecification"
            case disableScaleIn = "DisableScaleIn"
            case predefinedMetricSpecification = "PredefinedMetricSpecification"
            case targetValue = "TargetValue"
        }
    }

    public struct TargetTrackingMetricDataQuery: AWSEncodableShape & AWSDecodableShape {
        /// The math expression to perform on the returned data, if this object is performing a math expression. This expression can use the Id of the other metrics to refer to those metrics, and can also use the Id of other expressions to use the result of those expressions.  Conditional: Within each TargetTrackingMetricDataQuery object, you must specify either Expression or MetricStat, but not both.
        public let expression: String?
        /// A short name that identifies the object's results in the response. This name must be unique among all TargetTrackingMetricDataQuery objects specified for a single scaling policy. If you are performing math expressions on this set of data, this name represents that data and can serve as a variable in the mathematical expression. The valid characters are letters, numbers, and underscores. The first character must be a lowercase letter.
        public let id: String?
        /// A human-readable label for this metric or expression. This is especially useful if this is a math expression, so that you know what the value represents.
        public let label: String?
        /// Information about the metric data to return. Conditional: Within each TargetTrackingMetricDataQuery object, you must specify either Expression or MetricStat, but not both.
        public let metricStat: TargetTrackingMetricStat?
        ///  The period of the metric in seconds. The default value is 60. Accepted values are 10, 30, and 60. For high resolution metric, set the value to less than 60. For more information, see Create a target tracking policy using high-resolution metrics for faster response.
        public let period: Int?
        /// Indicates whether to return the timestamps and raw data values of this metric.  If you use any math expressions, specify true for this value for only the final math expression that the metric specification is based on. You must specify false for ReturnData for all the other metrics and expressions used in the metric specification. If you are only retrieving metrics and not performing any math expressions, do not specify anything for ReturnData. This sets it to its default (true).
        public let returnData: Bool?

        @inlinable
        public init(expression: String? = nil, id: String? = nil, label: String? = nil, metricStat: TargetTrackingMetricStat? = nil, period: Int? = nil, returnData: Bool? = nil) {
            self.expression = expression
            self.id = id
            self.label = label
            self.metricStat = metricStat
            self.period = period
            self.returnData = returnData
        }

        public func validate(name: String) throws {
            try self.validate(self.expression, name: "expression", parent: name, max: 2047)
            try self.validate(self.expression, name: "expression", parent: name, min: 1)
            try self.validate(self.expression, name: "expression", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.id, name: "id", parent: name, max: 64)
            try self.validate(self.id, name: "id", parent: name, min: 1)
            try self.validate(self.id, name: "id", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.label, name: "label", parent: name, max: 2047)
            try self.validate(self.label, name: "label", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.metricStat?.validate(name: "\(name).metricStat")
            try self.validate(self.period, name: "period", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case expression = "Expression"
            case id = "Id"
            case label = "Label"
            case metricStat = "MetricStat"
            case period = "Period"
            case returnData = "ReturnData"
        }
    }

    public struct TargetTrackingMetricStat: AWSEncodableShape & AWSDecodableShape {
        /// The metric to use.
        public let metric: Metric?
        ///  The period of the metric in seconds. The default value is 60. Accepted values are 10, 30, and 60. For high resolution metric, set the value to less than 60. For more information, see Create a target tracking policy using high-resolution metrics for faster response.
        public let period: Int?
        /// The statistic to return. It can include any CloudWatch statistic or extended statistic. For a list of valid values, see the table in Statistics in the Amazon CloudWatch User Guide. The most commonly used metric for scaling is Average.
        public let stat: String?
        /// The unit to use for the returned data points. For a complete list of the units that CloudWatch supports, see the MetricDatum data type in the Amazon CloudWatch API Reference.
        public let unit: String?

        @inlinable
        public init(metric: Metric? = nil, period: Int? = nil, stat: String? = nil, unit: String? = nil) {
            self.metric = metric
            self.period = period
            self.stat = stat
            self.unit = unit
        }

        public func validate(name: String) throws {
            try self.validate(self.period, name: "period", parent: name, min: 1)
            try self.validate(self.stat, name: "stat", parent: name, max: 100)
            try self.validate(self.stat, name: "stat", parent: name, min: 1)
            try self.validate(self.stat, name: "stat", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case metric = "Metric"
            case period = "Period"
            case stat = "Stat"
            case unit = "Unit"
        }
    }

    public struct TerminateInstanceInAutoScalingGroupType: AWSEncodableShape {
        /// The ID of the instance.
        public let instanceId: String?
        /// Indicates whether terminating the instance also decrements the size of the Auto Scaling group.
        public let shouldDecrementDesiredCapacity: Bool?

        @inlinable
        public init(instanceId: String? = nil, shouldDecrementDesiredCapacity: Bool? = nil) {
            self.instanceId = instanceId
            self.shouldDecrementDesiredCapacity = shouldDecrementDesiredCapacity
        }

        public func validate(name: String) throws {
            try self.validate(self.instanceId, name: "instanceId", parent: name, max: 19)
            try self.validate(self.instanceId, name: "instanceId", parent: name, min: 1)
            try self.validate(self.instanceId, name: "instanceId", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case instanceId = "InstanceId"
            case shouldDecrementDesiredCapacity = "ShouldDecrementDesiredCapacity"
        }
    }

    public struct TotalLocalStorageGBRequest: AWSEncodableShape & AWSDecodableShape {
        /// The storage maximum in GB.
        public let max: Double?
        /// The storage minimum in GB.
        public let min: Double?

        @inlinable
        public init(max: Double? = nil, min: Double? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0.0)
            try self.validate(self.min, name: "min", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct TrafficSourceIdentifier: AWSEncodableShape & AWSDecodableShape {
        /// Identifies the traffic source. For Application Load Balancers, Gateway Load Balancers, Network Load Balancers, and VPC Lattice, this will be the Amazon Resource Name (ARN) for a target group in this account and Region. For Classic Load Balancers, this will be the name of the Classic Load Balancer in this account and Region. For example:    Application Load Balancer ARN: arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/1234567890123456    Classic Load Balancer name: my-classic-load-balancer    VPC Lattice ARN: arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-1234567890123456    To get the ARN of a target group for a Application Load Balancer, Gateway Load Balancer, or Network Load Balancer, or the name of a Classic Load Balancer, use the Elastic Load Balancing DescribeTargetGroups and DescribeLoadBalancers API operations. To get the ARN of a target group for VPC Lattice, use the VPC Lattice GetTargetGroup API operation.
        public let identifier: String?
        /// Provides additional context for the value of Identifier. The following lists the valid values:    elb if Identifier is the name of a Classic Load Balancer.    elbv2 if Identifier is the ARN of an Application Load Balancer, Gateway Load Balancer, or Network Load Balancer target group.    vpc-lattice if Identifier is the ARN of a VPC Lattice target group.   Required if the identifier is the name of a Classic Load Balancer.
        public let type: String?

        @inlinable
        public init(identifier: String? = nil, type: String? = nil) {
            self.identifier = identifier
            self.type = type
        }

        public func validate(name: String) throws {
            try self.validate(self.identifier, name: "identifier", parent: name, max: 511)
            try self.validate(self.identifier, name: "identifier", parent: name, min: 1)
            try self.validate(self.identifier, name: "identifier", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.type, name: "type", parent: name, max: 511)
            try self.validate(self.type, name: "type", parent: name, min: 1)
            try self.validate(self.type, name: "type", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case identifier = "Identifier"
            case type = "Type"
        }
    }

    public struct TrafficSourceState: AWSDecodableShape {
        /// The unique identifier of the traffic source.
        public let identifier: String?
        /// Describes the current state of a traffic source. The state values are as follows:    Adding - The Auto Scaling instances are being registered with the load balancer or target group.    Added - All Auto Scaling instances are registered with the load balancer or target group.    InService - For an Elastic Load Balancing load balancer or target group, at least one Auto Scaling instance passed an ELB health check. For VPC Lattice, at least one Auto Scaling instance passed an VPC_LATTICE health check.    Removing - The Auto Scaling instances are being deregistered from the load balancer or target group. If connection draining (deregistration delay) is enabled, Elastic Load Balancing or VPC Lattice waits for in-flight requests to complete before deregistering the instances.    Removed - All Auto Scaling instances are deregistered from the load balancer or target group.
        public let state: String?
        /// This is replaced by Identifier.
        public let trafficSource: String?
        /// Provides additional context for the value of Identifier. The following lists the valid values:    elb if Identifier is the name of a Classic Load Balancer.    elbv2 if Identifier is the ARN of an Application Load Balancer, Gateway Load Balancer, or Network Load Balancer target group.    vpc-lattice if Identifier is the ARN of a VPC Lattice target group.   Required if the identifier is the name of a Classic Load Balancer.
        public let type: String?

        @inlinable
        public init(identifier: String? = nil, state: String? = nil, type: String? = nil) {
            self.identifier = identifier
            self.state = state
            self.trafficSource = nil
            self.type = type
        }

        @available(*, deprecated, message: "Members trafficSource have been deprecated")
        @inlinable
        public init(identifier: String? = nil, state: String? = nil, trafficSource: String? = nil, type: String? = nil) {
            self.identifier = identifier
            self.state = state
            self.trafficSource = trafficSource
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case identifier = "Identifier"
            case state = "State"
            case trafficSource = "TrafficSource"
            case type = "Type"
        }
    }

    public struct UpdateAutoScalingGroupType: AWSEncodableShape {
        /// The name of the Auto Scaling group.
        public let autoScalingGroupName: String?
        ///  The instance capacity distribution across Availability Zones.
        public let availabilityZoneDistribution: AvailabilityZoneDistribution?
        ///  The policy for Availability Zone impairment.
        public let availabilityZoneImpairmentPolicy: AvailabilityZoneImpairmentPolicy?
        /// One or more Availability Zones for the group.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var availabilityZones: [String]?
        /// Enables or disables Capacity Rebalancing. If Capacity Rebalancing is disabled, proactive replacement of at-risk Spot Instances does not occur. For more information, see Capacity Rebalancing in Auto Scaling to replace at-risk Spot Instances in the Amazon EC2 Auto Scaling User Guide.  To suspend rebalancing across Availability Zones, use the SuspendProcesses API.
        public let capacityRebalance: Bool?
        ///  The capacity reservation specification for the Auto Scaling group.
        public let capacityReservationSpecification: CapacityReservationSpecification?
        /// Reserved.
        public let context: String?
        ///  Only needed if you use simple scaling policies.  The amount of time, in seconds, between one scaling activity ending and another one starting due to simple scaling policies. For more information, see Scaling cooldowns for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide.
        public let defaultCooldown: Int?
        /// The amount of time, in seconds, until a new instance is considered to have finished initializing and resource consumption to become stable after it enters the InService state.  During an instance refresh, Amazon EC2 Auto Scaling waits for the warm-up period after it replaces an instance before it moves on to replacing the next instance. Amazon EC2 Auto Scaling also waits for the warm-up period before aggregating the metrics for new instances with existing instances in the Amazon CloudWatch metrics that are used for scaling, resulting in more reliable usage data. For more information, see Set the default instance warmup for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.  To manage various warm-up settings at the group level, we recommend that you set the default instance warmup, even if it is set to 0 seconds. To remove a value that you previously set, include the property but specify -1 for the value. However, we strongly recommend keeping the default instance warmup enabled by specifying a value of 0 or other nominal value.
        public let defaultInstanceWarmup: Int?
        /// The desired capacity is the initial capacity of the Auto Scaling group after this operation completes and the capacity it attempts to maintain. This number must be greater than or equal to the minimum size of the group and less than or equal to the maximum size of the group.
        public let desiredCapacity: Int?
        /// The unit of measurement for the value specified for desired capacity. Amazon EC2 Auto Scaling supports DesiredCapacityType for attribute-based instance type selection only. For more information, see Create a mixed instances group using attribute-based instance type selection in the Amazon EC2 Auto Scaling User Guide. By default, Amazon EC2 Auto Scaling specifies units, which translates into number of instances. Valid values: units | vcpu | memory-mib
        public let desiredCapacityType: String?
        /// The amount of time, in seconds, that Amazon EC2 Auto Scaling waits before checking the health status of an EC2 instance that has come into service and marking it unhealthy due to a failed health check. This is useful if your instances do not immediately pass their health checks after they enter the InService state. For more information, see Set the health check grace period for an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide.
        public let healthCheckGracePeriod: Int?
        /// A comma-separated value string of one or more health check types. The valid values are EC2, EBS, ELB, and VPC_LATTICE. EC2 is the default health check and cannot be disabled. For more information, see Health checks for instances in an Auto Scaling group in the Amazon EC2 Auto Scaling User Guide. Only specify EC2 if you must clear a value that was previously set.
        public let healthCheckType: String?
        /// An instance maintenance policy. For more information, see Set instance maintenance policy in the Amazon EC2 Auto Scaling User Guide.
        public let instanceMaintenancePolicy: InstanceMaintenancePolicy?
        /// The name of the launch configuration. If you specify LaunchConfigurationName in your update request, you can't specify LaunchTemplate or MixedInstancesPolicy.
        public let launchConfigurationName: String?
        /// The launch template and version to use to specify the updates. If you specify LaunchTemplate in your update request, you can't specify LaunchConfigurationName or MixedInstancesPolicy.
        public let launchTemplate: LaunchTemplateSpecification?
        /// The maximum amount of time, in seconds, that an instance can be in service. The default is null. If specified, the value must be either 0 or a number equal to or greater than 86,400 seconds (1 day). To clear a previously set value, specify a new value of 0. For more information, see Replacing Auto Scaling instances based on maximum instance lifetime in the Amazon EC2 Auto Scaling User Guide.
        public let maxInstanceLifetime: Int?
        /// The maximum size of the Auto Scaling group.  With a mixed instances policy that uses instance weighting, Amazon EC2 Auto Scaling may need to go above MaxSize to meet your capacity requirements. In this event, Amazon EC2 Auto Scaling will never go above MaxSize by more than your largest instance weight (weights that define how many units each instance contributes to the desired capacity of the group).
        public let maxSize: Int?
        /// The minimum size of the Auto Scaling group.
        public let minSize: Int?
        /// The mixed instances policy. For more information, see Auto Scaling groups with multiple instance types and purchase options in the Amazon EC2 Auto Scaling User Guide.
        public let mixedInstancesPolicy: MixedInstancesPolicy?
        /// Indicates whether newly launched instances are protected from termination by Amazon EC2 Auto Scaling when scaling in. For more information about preventing instances from terminating on scale in, see Use instance scale-in protection in the Amazon EC2 Auto Scaling User Guide.
        public let newInstancesProtectedFromScaleIn: Bool?
        /// The name of an existing placement group into which to launch your instances. To remove the placement group setting, pass an empty string for placement-group. For more information about placement groups, see Placement groups in the Amazon EC2 User Guide.  A cluster placement group is a logical grouping of instances within a single Availability Zone. You cannot specify multiple Availability Zones and a cluster placement group.
        public let placementGroup: String?
        /// The Amazon Resource Name (ARN) of the service-linked role that the Auto Scaling group uses to call other Amazon Web Services on your behalf. For more information, see Service-linked roles in the Amazon EC2 Auto Scaling User Guide.
        public let serviceLinkedRoleARN: String?
        ///  If you enable zonal shift with cross-zone disabled load balancers, capacity could become imbalanced across Availability Zones. To skip the validation, specify true. For more information, see Auto Scaling group zonal shift in the Amazon EC2 Auto Scaling User Guide.
        public let skipZonalShiftValidation: Bool?
        /// A policy or a list of policies that are used to select the instances to terminate. The policies are executed in the order that you list them. For more information, see Configure termination policies for Amazon EC2 Auto Scaling in the Amazon EC2 Auto Scaling User Guide. Valid values: Default | AllocationStrategy | ClosestToNextInstanceHour | NewestInstance | OldestInstance | OldestLaunchConfiguration | OldestLaunchTemplate | arn:aws:lambda:region:account-id:function:my-function:my-alias
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var terminationPolicies: [String]?
        /// A comma-separated list of subnet IDs for a virtual private cloud (VPC). If you specify VPCZoneIdentifier with AvailabilityZones, the subnets that you specify must reside in those Availability Zones.
        public let vpcZoneIdentifier: String?

        @inlinable
        public init(autoScalingGroupName: String? = nil, availabilityZoneDistribution: AvailabilityZoneDistribution? = nil, availabilityZoneImpairmentPolicy: AvailabilityZoneImpairmentPolicy? = nil, availabilityZones: [String]? = nil, capacityRebalance: Bool? = nil, capacityReservationSpecification: CapacityReservationSpecification? = nil, context: String? = nil, defaultCooldown: Int? = nil, defaultInstanceWarmup: Int? = nil, desiredCapacity: Int? = nil, desiredCapacityType: String? = nil, healthCheckGracePeriod: Int? = nil, healthCheckType: String? = nil, instanceMaintenancePolicy: InstanceMaintenancePolicy? = nil, launchConfigurationName: String? = nil, launchTemplate: LaunchTemplateSpecification? = nil, maxInstanceLifetime: Int? = nil, maxSize: Int? = nil, minSize: Int? = nil, mixedInstancesPolicy: MixedInstancesPolicy? = nil, newInstancesProtectedFromScaleIn: Bool? = nil, placementGroup: String? = nil, serviceLinkedRoleARN: String? = nil, skipZonalShiftValidation: Bool? = nil, terminationPolicies: [String]? = nil, vpcZoneIdentifier: String? = nil) {
            self.autoScalingGroupName = autoScalingGroupName
            self.availabilityZoneDistribution = availabilityZoneDistribution
            self.availabilityZoneImpairmentPolicy = availabilityZoneImpairmentPolicy
            self.availabilityZones = availabilityZones
            self.capacityRebalance = capacityRebalance
            self.capacityReservationSpecification = capacityReservationSpecification
            self.context = context
            self.defaultCooldown = defaultCooldown
            self.defaultInstanceWarmup = defaultInstanceWarmup
            self.desiredCapacity = desiredCapacity
            self.desiredCapacityType = desiredCapacityType
            self.healthCheckGracePeriod = healthCheckGracePeriod
            self.healthCheckType = healthCheckType
            self.instanceMaintenancePolicy = instanceMaintenancePolicy
            self.launchConfigurationName = launchConfigurationName
            self.launchTemplate = launchTemplate
            self.maxInstanceLifetime = maxInstanceLifetime
            self.maxSize = maxSize
            self.minSize = minSize
            self.mixedInstancesPolicy = mixedInstancesPolicy
            self.newInstancesProtectedFromScaleIn = newInstancesProtectedFromScaleIn
            self.placementGroup = placementGroup
            self.serviceLinkedRoleARN = serviceLinkedRoleARN
            self.skipZonalShiftValidation = skipZonalShiftValidation
            self.terminationPolicies = terminationPolicies
            self.vpcZoneIdentifier = vpcZoneIdentifier
        }

        public func validate(name: String) throws {
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, max: 255)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, min: 1)
            try self.validate(self.autoScalingGroupName, name: "autoScalingGroupName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.availabilityZones?.forEach {
                try validate($0, name: "availabilityZones[]", parent: name, max: 255)
                try validate($0, name: "availabilityZones[]", parent: name, min: 1)
                try validate($0, name: "availabilityZones[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.capacityReservationSpecification?.validate(name: "\(name).capacityReservationSpecification")
            try self.validate(self.desiredCapacityType, name: "desiredCapacityType", parent: name, max: 255)
            try self.validate(self.desiredCapacityType, name: "desiredCapacityType", parent: name, min: 1)
            try self.validate(self.desiredCapacityType, name: "desiredCapacityType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.healthCheckType, name: "healthCheckType", parent: name, max: 32)
            try self.validate(self.healthCheckType, name: "healthCheckType", parent: name, min: 1)
            try self.validate(self.healthCheckType, name: "healthCheckType", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.instanceMaintenancePolicy?.validate(name: "\(name).instanceMaintenancePolicy")
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, max: 255)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, min: 1)
            try self.validate(self.launchConfigurationName, name: "launchConfigurationName", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.launchTemplate?.validate(name: "\(name).launchTemplate")
            try self.mixedInstancesPolicy?.validate(name: "\(name).mixedInstancesPolicy")
            try self.validate(self.placementGroup, name: "placementGroup", parent: name, max: 255)
            try self.validate(self.placementGroup, name: "placementGroup", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.validate(self.serviceLinkedRoleARN, name: "serviceLinkedRoleARN", parent: name, max: 1600)
            try self.validate(self.serviceLinkedRoleARN, name: "serviceLinkedRoleARN", parent: name, min: 1)
            try self.validate(self.serviceLinkedRoleARN, name: "serviceLinkedRoleARN", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            try self.terminationPolicies?.forEach {
                try validate($0, name: "terminationPolicies[]", parent: name, max: 1600)
                try validate($0, name: "terminationPolicies[]", parent: name, min: 1)
                try validate($0, name: "terminationPolicies[]", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
            }
            try self.validate(self.vpcZoneIdentifier, name: "vpcZoneIdentifier", parent: name, max: 5000)
            try self.validate(self.vpcZoneIdentifier, name: "vpcZoneIdentifier", parent: name, min: 1)
            try self.validate(self.vpcZoneIdentifier, name: "vpcZoneIdentifier", parent: name, pattern: "^[\\u0020-\\uD7FF\\uE000-\\uFFFD\\uD800\\uDC00-\\uDBFF\\uDFFF\\r\\n\\t]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroupName = "AutoScalingGroupName"
            case availabilityZoneDistribution = "AvailabilityZoneDistribution"
            case availabilityZoneImpairmentPolicy = "AvailabilityZoneImpairmentPolicy"
            case availabilityZones = "AvailabilityZones"
            case capacityRebalance = "CapacityRebalance"
            case capacityReservationSpecification = "CapacityReservationSpecification"
            case context = "Context"
            case defaultCooldown = "DefaultCooldown"
            case defaultInstanceWarmup = "DefaultInstanceWarmup"
            case desiredCapacity = "DesiredCapacity"
            case desiredCapacityType = "DesiredCapacityType"
            case healthCheckGracePeriod = "HealthCheckGracePeriod"
            case healthCheckType = "HealthCheckType"
            case instanceMaintenancePolicy = "InstanceMaintenancePolicy"
            case launchConfigurationName = "LaunchConfigurationName"
            case launchTemplate = "LaunchTemplate"
            case maxInstanceLifetime = "MaxInstanceLifetime"
            case maxSize = "MaxSize"
            case minSize = "MinSize"
            case mixedInstancesPolicy = "MixedInstancesPolicy"
            case newInstancesProtectedFromScaleIn = "NewInstancesProtectedFromScaleIn"
            case placementGroup = "PlacementGroup"
            case serviceLinkedRoleARN = "ServiceLinkedRoleARN"
            case skipZonalShiftValidation = "SkipZonalShiftValidation"
            case terminationPolicies = "TerminationPolicies"
            case vpcZoneIdentifier = "VPCZoneIdentifier"
        }
    }

    public struct VCpuCountRequest: AWSEncodableShape & AWSDecodableShape {
        /// The maximum number of vCPUs.
        public let max: Int?
        /// The minimum number of vCPUs.
        public let min: Int?

        @inlinable
        public init(max: Int? = nil, min: Int? = nil) {
            self.max = max
            self.min = min
        }

        public func validate(name: String) throws {
            try self.validate(self.max, name: "max", parent: name, min: 0)
            try self.validate(self.min, name: "min", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case max = "Max"
            case min = "Min"
        }
    }

    public struct WarmPoolConfiguration: AWSDecodableShape {
        /// The instance reuse policy.
        public let instanceReusePolicy: InstanceReusePolicy?
        /// The maximum number of instances that are allowed to be in the warm pool or in any state except Terminated for the Auto Scaling group.
        public let maxGroupPreparedCapacity: Int?
        /// The minimum number of instances to maintain in the warm pool.
        public let minSize: Int?
        /// The instance state to transition to after the lifecycle actions are complete.
        public let poolState: WarmPoolState?
        /// The status of a warm pool that is marked for deletion.
        public let status: WarmPoolStatus?

        @inlinable
        public init(instanceReusePolicy: InstanceReusePolicy? = nil, maxGroupPreparedCapacity: Int? = nil, minSize: Int? = nil, poolState: WarmPoolState? = nil, status: WarmPoolStatus? = nil) {
            self.instanceReusePolicy = instanceReusePolicy
            self.maxGroupPreparedCapacity = maxGroupPreparedCapacity
            self.minSize = minSize
            self.poolState = poolState
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case instanceReusePolicy = "InstanceReusePolicy"
            case maxGroupPreparedCapacity = "MaxGroupPreparedCapacity"
            case minSize = "MinSize"
            case poolState = "PoolState"
            case status = "Status"
        }
    }
}

// MARK: - Errors

/// Error enum for AutoScaling
public struct AutoScalingErrorType: AWSErrorType {
    enum Code: String {
        case activeInstanceRefreshNotFoundFault = "ActiveInstanceRefreshNotFound"
        case alreadyExistsFault = "AlreadyExists"
        case instanceRefreshInProgressFault = "InstanceRefreshInProgress"
        case invalidNextToken = "InvalidNextToken"
        case irreversibleInstanceRefreshFault = "IrreversibleInstanceRefresh"
        case limitExceededFault = "LimitExceeded"
        case resourceContentionFault = "ResourceContention"
        case resourceInUseFault = "ResourceInUse"
        case scalingActivityInProgressFault = "ScalingActivityInProgress"
        case serviceLinkedRoleFailure = "ServiceLinkedRoleFailure"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize AutoScaling
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// The request failed because an active instance refresh or rollback for the specified Auto Scaling group was not found.
    public static var activeInstanceRefreshNotFoundFault: Self { .init(.activeInstanceRefreshNotFoundFault) }
    /// You already have an Auto Scaling group or launch configuration with this name.
    public static var alreadyExistsFault: Self { .init(.alreadyExistsFault) }
    /// The request failed because an active instance refresh already exists for the specified Auto Scaling group.
    public static var instanceRefreshInProgressFault: Self { .init(.instanceRefreshInProgressFault) }
    /// The NextToken value is not valid.
    public static var invalidNextToken: Self { .init(.invalidNextToken) }
    /// The request failed because a desired configuration was not found or an incompatible launch template (uses a Systems Manager parameter instead of an AMI ID) or launch template version ($Latest or $Default) is present on the Auto Scaling group.
    public static var irreversibleInstanceRefreshFault: Self { .init(.irreversibleInstanceRefreshFault) }
    /// You have already reached a limit for your Amazon EC2 Auto Scaling resources (for example, Auto Scaling groups, launch configurations, or lifecycle hooks). For more information, see DescribeAccountLimits in the Amazon EC2 Auto Scaling API Reference.
    public static var limitExceededFault: Self { .init(.limitExceededFault) }
    /// You already have a pending update to an Amazon EC2 Auto Scaling resource (for example, an Auto Scaling group, instance, or load balancer).
    public static var resourceContentionFault: Self { .init(.resourceContentionFault) }
    /// The operation can't be performed because the resource is in use.
    public static var resourceInUseFault: Self { .init(.resourceInUseFault) }
    /// The operation can't be performed because there are scaling activities in progress.
    public static var scalingActivityInProgressFault: Self { .init(.scalingActivityInProgressFault) }
    /// The service-linked role is not yet ready for use.
    public static var serviceLinkedRoleFailure: Self { .init(.serviceLinkedRoleFailure) }
}

extension AutoScalingErrorType: Equatable {
    public static func == (lhs: AutoScalingErrorType, rhs: AutoScalingErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension AutoScalingErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
